Как я могу определить поворот экрана? - PullRequest
11 голосов
/ 01 августа 2011

можно ли обнаружить поворот экрана?Я имею в виду - только ротацию, которая четко отличается от инициализации действия от другого действия?

Методы onXxx, кажется, не годятся для этого, я попытался добавить / удалить flag из starting Intent (удаление, кажется, не отражается, при повороте флаг есть), и попытался добавить android: configChanges = "direction" для действия в манифесте, однако метод onConfigurationChanged, кажется, вызываетсякаждая вторая ротация ... проводная.

Наверное, я что-то упустил ... но не нашел четкого решения в других связанных темах.

Есть идеи?

Ответы [ 3 ]

15 голосов
/ 01 августа 2011

Manifest:

<activity android:name=".MyActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/>

Активность:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}

Попробуйте эту ссылку также

Как определить поворот экрана

3 голосов
/ 22 марта 2017

Использование метода onConfigurationChanged для определения поворота экрана не очень хорошая идея.Изменение конфигурации в этом действии не будет работать правильно, когда пользователь поворачивает экран.

Поэтому я использую это решение для решения этой проблемы.

public class SampleActivity extends AppCompatActivity {
    public static final String KEY_LAST_ORIENTATION = "last_orientation";
    private int lastOrientation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        if (savedInstanceState == null) {
            lastOrientation = getResources().getConfiguration().orientation;
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        checkOrientationChanged();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        lastOrientation = savedInstanceState.getInt(KEY_LAST_ORIENTATION);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(KEY_LAST_ORIENTATION, lastOrientation);
    }

    private void checkOrientationChanged() {
        int currentOrientation = getResources().getConfiguration().orientation;
        if (currentOrientation != lastOrientation) {
            onScreenOrientationChanged(currentOrientation);
            lastOrientation = currentOrientation;
        }
    }

    public void onScreenOrientationChanged(int currentOrientation) {
        // Do something here when screen orientation changed
    }
}

Но код все еще недостаточно хорош для его использования.в моем проекте, поэтому я применил этот код к своей собственной библиотеке (https://github.com/akexorcist/ScreenOrientationHelper).

compile 'com.akexorcist:screenorientationhelper:<latest_version>'

. Вы можете создать базовый класс активности, например, такой:

    public class BaseActivity extends AppCompatActivity implements ScreenOrientationHelper.ScreenOrientationChangeListener {
    private ScreenOrientationHelper helper = new ScreenOrientationHelper(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        helper.onCreate(savedInstanceState);
        helper.setScreenOrientationChangeListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        helper.onStart();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        helper.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        helper.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    public void onScreenOrientationChanged(int orientation) {

    }
}

Затем расширить действие с помощью этой базы.класс

public class MainActivity extends BaseActivity {

    ...

    @Override
    public void onScreenOrientationChanged(int orientation) {
        // Do something when screen orientation changed
    }
}

Готово!

0 голосов
/ 01 августа 2011

Почему бы вам не попробовать это?

in onCreated получить ориентацию телефона:

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
myOrientation = display.getOrientation();

затем переопределите метод onConfigurationChanged и проверьте, изменилась ли ориентация:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if(newConfig.orientation != myOrientation)
        Log.v(tag, "rotated");
    super.onConfigurationChanged(newConfig);
}

Не забудьте добавить в манифест android:configChanges="orientation" в упражнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...