onConfigurationChanged не вызывается для 180 и 270 градусов - PullRequest
0 голосов
/ 16 января 2019

Я столкнулся со странной проблемой (или, возможно, неожиданным поведением) на моем устройстве Android.

Проблема в том, что я слушаю изменения конфигурации в моем DialogFragment, как это:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Do something secret here :)
}

Я добавил android:configChanges в Activity, которая отвечает за отображение фрагмента диалога

<activity
    android:name=".SecretActivity" 
    android:configChanges="orientation|screenSize"
    android:windowSoftInputMode="adjustResize" />

и действительно я получаю обратные вызовы от системы, когда я вращаю устройство, но не во всех случаях. Как вы можете видеть на рисунке onConfigurationChanged( ) вызывается только тогда, когда я поворачиваю на 90 градусов, а также на 360, в других случаях он не вызывается.

Это ожидаемое поведение? Если да, как я могу обнаружить все повороты (90, 180, 270, 360)?

enter image description here

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Если у вас есть действие с неопределенной ориентацией экрана, устройства обычно игнорируют поворот на 180 ° и поддерживают только одно горизонтальное направление.

Чтобы поддерживать все направления, добавьте явный атрибут screenOrientationзапись манифеста активности: user или sensor, в зависимости от того, хотите ли вы поддерживать блокировку ориентации устройства пользователем или нет.

0 голосов
/ 22 января 2019

изменить это

<activity
android:name=".SecretActivity" 
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize" />

к этому

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

и, пожалуйста, проверьте этот ответ второй ответ, который я имею в виду.

0 голосов
/ 28 января 2019

OrientationEventlistener не будет работать, когда устройство не вращается / движется.

Я считаю, что прослушиватель экрана - лучший способ обнаружить изменение.

 DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {
    @Override
    public void onDisplayAdded(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " added.");
    }

    @Override
    public void onDisplayChanged(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " changed.");
    }

    @Override
    public void onDisplayRemoved(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " removed.");
    }
 };
 DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);
 displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler);

onDisplayChanged срабатывает только тогда, когда изменяется getRotation (). OrientationEventListener, с другой стороны, постоянно запускается в режиме реального времени и даже до изменения getRotation (), что приводит к совершенно неправильным значениям поворота экрана при повороте на 180 ° с перспективы.

0 голосов
/ 22 января 2019

Хм, проверьте манифест, добавьте / измените

android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...