Re: Ориентация

Здравствуйте. Подскажите, зачем в примере вы объявили два объекта String как static, какое это имеет практическое значение:
static final String ORIENTATION_PORTRAIT = "Портретный режим";
static final String ORIENTATION_LANDSCAPE = "Альбомный режим";

Re: Ориентация

Для данного примера это не важно. Можете не использовать.

28 (edited by dimafrombatumi 2016-05-16 10:45:13)

Re: Ориентация

Здравствуйте! Вопрос следующий: почему при создании функции(метода) private String getScreenOrientation(){.....}
Используется String. Насколько мне известно должен быть тип void. Да и студия его требует.

Re: Ориентация

Что-то странное вы написали. Это мой метод, что хочу, то и использую. Не знаю, что там у вас студия требует, но требует она слишком много. Гоните такую студию взашей.

Re: Ориентация

Александр добрый день, спасибо огромное за Ваши уроки, нигде не встречал более доходчивого и доступного обучения. Теперь по делу, никак не пойму, функция определения поворота getRotateOrientation() определяет только поворот на 90град. по или против часовой, остальные 180 и 270 ни в какую, да и вверх тормашками не поворачивается.

Re: Ориентация

Не знаю, в чем может быть дело. Должно работать.

32 (edited by rusyaka84 2016-07-03 01:06:10)

Re: Ориентация

alexander.klimoff wrote:

Не знаю, в чем может быть дело. Должно работать.

Вот что я налепил и это не работает должным образом не на эмуляторе, не на samsung S7


package com.example.example6;

import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Surface;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    public String mPortraitOrientation = "Портретная ориентация";
    public String mLandscapeOrientation = "Альбомная ориентация";
    public String noRotation = "Nы не поворачивал";
    public String ntenRotation = "О, повернул на 90 градусов против часовой срелки";
    public String ahRotation = "О, повернул на 180 градусов";
    public String tsRotation = "О, повернул на 90 градусов по часовой стрелки";
    public String noFing = "Ничего непонятно smile";
    public TextView infoTextView;
    public TextView infoTextView2;
    boolean mState = false;
    public Button mButton;
    static final String ORIENTATION_LANDSCAPE = "Перейти на альбомную ориентацию";
    static final String ORIENTATION_PORTRAIT = "Перейти на портретную ориентацию";

    private static final String KEY_COUNT = "COUNT";
    public int mCount;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        infoTextView = (TextView)findViewById(R.id.textView);
        infoTextView2 = (TextView)findViewById(R.id.textView2);
        infoTextView.setText(getRotateOrientation());
        infoTextView2.setText(mScreenOrientation());
        mButton = (Button)findViewById(R.id.button);
        mButton.setText(ORIENTATION_LANDSCAPE);
    }

   

   public String getRotateOrientation () {
        int rotate = getWindowManager().getDefaultDisplay().getRotation();
        switch (rotate) {
            case Surface.ROTATION_0:
                return noRotation;
            case Surface.ROTATION_90:
                return ntenRotation;
            case Surface.ROTATION_180:
                return ahRotation;
            case Surface.ROTATION_270:
                return tsRotation;
            default:
                return noFing;
        }
    }
    public String mScreenOrientation (){
        if (getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT)
            return (mPortraitOrientation);
        else if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE)
            return (mLandscapeOrientation);
        else return "";
    }

    public String onButtonClick(View view) {
        if (!mState){
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            mButton.setText(ORIENTATION_PORTRAIT);
        }
        else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            mButton.setText(ORIENTATION_LANDSCAPE);
        }
        mState=!mState;
        return "";
    }
}

Re: Ориентация

Добрый день.

Зашел в тупик. Помогите разобраться ПЛЗ.
Вообщем как я понимаю при смене ориентации телефона происходит уничтожение фрагмента а затем и самого активити.
Но я столкнулся с одной не понятной для меня странностью..
Поставил на все действия активити и фрагмента логирование. Вот что выходит:

Запустил....
03-15 16:47:19.038 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-15 16:47:19.038 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter init
03-15 16:47:19.044 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStart
03-15 16:47:19.045 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onResume
03-15 16:47:19.083 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter getItem
03-15 16:47:19.085 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-15 16:47:19.085 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreate
03-15 16:47:19.087 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreateView

----------------------
Перевернул телефон.....
03-15 16:47:28.265 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onPause
03-15 16:47:28.265 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onPause
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onSaveInstanceState
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onStop
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStop
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDestroyView
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDestroy
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDetach
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onDestroy
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreate
03-15 16:47:28.339 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-15 16:47:28.339 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter init
03-15 16:47:28.347 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreateView
03-15 16:47:28.347 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStart
03-15 16:47:28.348 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onRestoreInstanceState
03-15 16:47:28.349 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onResume

Почему
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreate
Присоединение и создание фрагмента происходит раньше чем onCreate активити?

Спасибо.

Re: Ориентация

А что вас смущает? Фрагменту нужно создать себя и присоединить себя к активности до того, как сама активность будет создана. Она же является её частью и нужно заранее подготовить память и ресурсы.

Re: Ориентация

Смущает наверное то, что я нигде об этом не слыхал ... везде пишут, что создается активность и уже к ней подключается (создается и тп) фрагмент.
У меня из-за этого небольшие нестыковки.
На активити есть ViewPager через адаптер он вставляет фрагменты.
В активити onCreate я инициализирую адаптер, в котором создаются объекты фрагментов, которые он должен вставить. А фрагменты оказывается уже существуют. И получается путаница видимы одни фрагменты, а если мне нужен объект фрагмента, адаптер мне выдает совершенно другие объекты фрагментов в которых естественно getContext() будет выдавать null

Re: Ориентация

Не важно, что везде пишут. Важно, что у вас происходит. Вполне допускаю, что в разных версиях поведение менялось, вроде на какой-то конференции что-то такое с фрагментами обсуждалось, сейчас не могу сказать, связано ли это с темой вашего вопроса.
По поводу путаницы - возможно следует переопределить логику вашего кода, чтобы получать предсказуемые результаты.

Re: Ориентация

Все разобрался. Это у меня хулиганил FragmentPagerAdapter ... он втихоря пересоздавал фрагменты. А я пытался их вытащить getItem(int position) ... порыскал в инете, люди тоже сталкивались с такими проблемами. И нашел решение вместо getItem использовать instantiateItem(GroupView view, int position). Он дает реально установленный фрагмент. а не подсовывает одинокие (без активити)
Может кому пригодится.

38 (edited by rellepro 2017-06-21 17:23:37)

Re: Ориентация

Добрый день, хотелось бы уточнить следующий ньюанс.  При смене ориентации пересоздается активность, в том числе вызывается повторно метод onCreate().  Почему тогда не меняется значение editText  при повороте:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EditText editText = (EditText) findViewById(R.id.editText);
        editText.setText(getScreenOrientation());
    }

    private String getScreenOrientation() {
        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
            return "Портретная ориентация";
        else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
            return "Альбомная ориентация";
        else
            return "";

    }
id текстового поля что в портретной что в ландшафтной разметке одинаковы
P.S.  почитал про жизненный цикл активности и разобрался... Вопрос снят.))

Re: Ориентация

Button knopka = (Button) findViewById(R.id.button4);есть ли альтернатива этому способу, потому что в Студио отображает Баттон перечёркнутый

Re: Ориентация

Дорогой Александр, здравствуйте. У меня возник вопрос: вы специально даёте примеры не рабочего кода? (что бы ученик сам делал из него рабочий). Если я, по своей неопытности, ошибаюсь, то не судите строго, но пример со "счётчиком ворон", оптимизированном для смены ориентации, в том виде, в котором представлен, работает некорректно. Есть и другие примеры вашего кода, которые в представленном виде не работают, из-за этого много времени уходит на поиск правильной конструкции. Плюс в том что понимание происходит гораздо лучше, но времени всё равно много занимает.

Re: Ориентация

Уроки существуют уже пять лет и по ним выучилось тысячи человек. Если у вас что-то не получается, значит вы что-то не так делаете. Я не экстрасенс и определить ваши ошибки по вашим сообщениям не в состоянии. Можете описать свою проблему в письме, попробуем разобраться.

Re: Ориентация

Начинаю делать данный урок... Создал Landskape ориентацию... скопировал код... вернул, что бы создать автоматом в Andriod Studio Создал автоматом, долго копался, как все таки расставить кнопки, как я хочу (без копирования когда), расставил
Выдает ошибку - button should be borderless, нор при этом, все отлично работает, отображается как я хочу...
Если не трудно объясните что не так...
https://github.com/KirillNN/Orienration
Заранее благодарен :-)

Re: Ориентация

Это не ошибка (иначе бы не запустилось), а предупреждение. Просто советуют поменять стиль кнопки. Если вас устраивает, то оставляйте.

Re: Ориентация

А как сохранить ресурс?? что бы при смене Ориентации экрана сохранялся цвет фона??
С текстом кнопки разобрался... а вот что делать с цветом фона, придумать не могу...
Переделываю Светофор под "повороты экрана" :-)
https://github.com/KirillNN/TrafficLight

public class light extends Activity {
    private ConstraintLayout mConstraintLayout;
    private TextView mInfoTextView;
    private static final String KEY_COLOR = "COLOR";
    private static final String KEY_BUTTON = "BUTTON";
    private static String COLOR_STRING_SAVE = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_light);
        mConstraintLayout = findViewById(R.id.layout);
        mInfoTextView = findViewById(R.id.textView);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
        if (savedInstanceState != null) {
            mInfoTextView.setText(savedInstanceState.getString(KEY_COLOR, COLOR_STRING_SAVE));
        } else {
            mInfoTextView.setText(R.string.buttonRed);
        }
    }

    public void onButtonRedClick(View view) {
        mInfoTextView.setText(R.string.buttonRed);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
    }

    public void onButtonYellowClick(View view) {
        mInfoTextView.setText(R.string.buttonYellow);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorYellow));
    }

    public void onButtonGreenClick(View view) {
        mInfoTextView.setText(R.string.buttonGreen);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorGreen));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        COLOR_STRING_SAVE = mInfoTextView.getText().toString();
        outState.putString(KEY_BUTTON, COLOR_STRING_SAVE);

    }
}

Re: Ориентация

http://developer.alexanderklimov.ru/and … .php#color

46 (edited by kirill_nn 2017-11-14 21:19:40)

Re: Ориентация

2 alexander.klimoff спасибо! Прочитаю обязательно. Пока сделал через "костылик"

import android.app.Activity;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.view.View;
import android.widget.TextView;

public class light extends Activity {
    private ConstraintLayout mConstraintLayout;
    private TextView mInfoTextView;
    private static final String KEY_COLOR = "COLOR";
    private static String COLOR_STRING_SAVE = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_light);
        mConstraintLayout = findViewById(R.id.layout);
        mInfoTextView = findViewById(R.id.textView);
        if (savedInstanceState != null) {
            if (savedInstanceState.getString(KEY_COLOR, COLOR_STRING_SAVE).equals("red")) {
                red();
            } else if (savedInstanceState.getString(KEY_COLOR, COLOR_STRING_SAVE).equals("yellow")) {
                yellow();
            } else if (savedInstanceState.getString(KEY_COLOR, COLOR_STRING_SAVE).equals("green")) {
                green();
            } else { //for savedInstanceState error
                red();
            }
        } else {
            red();
        }
    }

    public void onButtonRedClick(View view) {
        red();
    }

    public void onButtonYellowClick(View view) {
        yellow();
    }

    public void onButtonGreenClick(View view) {
        green();
    }

    public void red() {
        mInfoTextView.setText(R.string.buttonRed);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
        COLOR_STRING_SAVE = "red";
    }

    public void yellow() {
        mInfoTextView.setText(R.string.buttonYellow);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorYellow));
        COLOR_STRING_SAVE = "yellow";
    }

    public void green() {
        mInfoTextView.setText(R.string.buttonGreen);
        mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorGreen));
        COLOR_STRING_SAVE = "green";
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_COLOR, COLOR_STRING_SAVE);
    }
}

Прочитал.
Вы про способ

int myRedColor = activity.getResourses.getColor(R.color.red); // получаем значение красного цвета

Запомнить цвет как Int?? интересненько... нада запомнить :-)
PS никогда не думал, что просто переворот девайса - это куча алгоритмов, и действий :-)
А мне кстати мой  способ через "костылик" нравиться :-)

Re: Ориентация

Это ничем не отличается от вашего mConstraintLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));

Re: Ориентация

alexander.klimoff wrote:

Это не ошибка (иначе бы не запустилось), а предупреждение. Просто советуют поменять стиль кнопки. Если вас устраивает, то оставляйте.

Вы об этом
---
Отдельно стоит отметить создание стиля для кнопки. У кнопки есть несколько состояний - обычное, в фокусе, нажатое, нажатое с фокусом. Поэтому для кнопки нужно создать четыре отдельных стиля, чтобы кнопка выглядела профессионально.
----
??

Re: Ориентация

Нет. Добавьте кнопку в разметку и в режиме Design посмотрите у кнопки атрибут Style. Кнопка может быть разной внешне.

Re: Ориентация

Здравствуйте!
Почему getRotation не правильно определяется?
При повороте вправо выдается: "повернули на 90 градусов против часовой стрелки", тоже самое при любом другом положении, кроме default.

Вот код:

package ru.buslay.rotateme;

import android.content.res.Configuration;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Surface;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    private String getScreenOrientation(){
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
            return "Портретная ориентация";
        else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
            return "Альбомная ориентация";
        else
            return "";
    }
    private String getRotateOrientation() {
        int rotate = getWindowManager().getDefaultDisplay().getRotation();

        switch (rotate){
            case Surface.ROTATION_0:
                return "Не поворачивали";
            case Surface.ROTATION_90:
                return "Повернули на 90 градусов по часовой стрелке";
            case Surface.ROTATION_180:
                return "Повернули на 180 градусов";
            case Surface.ROTATION_270:
                return "Повернули на 90 градусов против часовой стрелки";
            default:
                return "Не понятно";
        }
    }

    public void push(View view) {
        Toast toast = Toast.makeText(getApplicationContext(),getScreenOrientation(),Toast.LENGTH_SHORT);
        toast.show();
    }
    public void pushItReal(View view){
        Toast toast = Toast.makeText(getApplicationContext(),getRotateOrientation(),Toast.LENGTH_LONG);
        toast.show();
    }
}