Как обнаружить изменение ориентации в макете в Android? - PullRequest
93 голосов
/ 20 апреля 2011

Я только что реализовал функцию изменения ориентации - например, когда макет меняется от портрета к ландшафту (или наоборот). Как я могу определить, когда событие изменения ориентации закончилось.

OrientationEventListener не работал. Как я могу получать уведомления о событиях изменения ориентации макета?

Ответы [ 8 ]

270 голосов
/ 20 апреля 2011

Используйте метод действия onConfigurationChanged .См. Следующий код:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

Вы также должны отредактировать соответствующий элемент в файле манифеста, чтобы включить android: configChanges Просто посмотрите код ниже:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

ПРИМЕЧАНИЕ: с Android 3.2 (уровень API 13) или выше, «размер экрана» также изменяется, когда устройство переключается между книжной и альбомной ориентацией.Таким образом, если вы хотите предотвратить перезапуск во время выполнения из-за изменения ориентации при разработке для API уровня 13 или выше, вы должны объявить android: configChanges = "direction | screenSize" для API уровня 13 или выше .

Надеюсь, это поможет вам ...:)

12 голосов
/ 23 июня 2013

Просто хотел показать вам способ сохранить все ваши Bundle после onConfigurationChanged:

Создайте новый Bundle сразу после вашего класса:

public class MainActivity extends Activity {
    Bundle newBundy = new Bundle();

Далее, после слова "protected void onCreate" добавьте:

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            onSaveInstanceState(newBundy);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            onSaveInstanceState(newBundy);
        }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBundle("newBundy", newBundy);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getBundle("newBundy");
}

Если вы добавите это, все ваши классы ящиков будут сохранены в MainActivity.

Но лучше всего добавить это в свой AndroidManifest:

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
12 голосов
/ 06 ноября 2012

Для загрузки макета в layout-land папка означает, что у вас есть два отдельных макета, тогда вам нужно сделать setContentView в onConfigurationChanged методе.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.yourxmlinlayout-land);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.yourxmlinlayoutfolder);
    }
}

Если у вас есть только один макет, нет необходимости делать setContentView в этом методе. просто

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}
4 голосов
/ 27 июня 2017

используйте этот метод

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show();
       //add your code what you want to do when screen on PORTRAIT MODE
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show();
        //add your code what you want to do when screen on LANDSCAPE MODE
   }
}

И не забудьте добавить это в свой Androidmainfest.xml

android:configChanges="orientation|screenSize"

вот так

<activity android:name=".MainActivity"
          android:theme="@style/Theme.AppCompat.NoActionBar"
          android:configChanges="orientation|screenSize">

    </activity>
3 голосов
/ 20 апреля 2011

Переопределить метод действия onConfigurationChanged

0 голосов
/ 31 мая 2019

Если принятый ответ не работает для вас, убедитесь, что вы не определили в файле манифеста:

android:screenOrientation="portrait"

В моем случае.

0 голосов
/ 07 февраля 2019

Я просто хочу предложить другую альтернативу, которая действительно затронет некоторых из вас, как объяснено выше:

android:configChanges="orientation|keyboardHidden" 

подразумевает, что мы явно объявляем макет для внедрения.

В случае, если мы хотим сохранить автоматический впрыск благодаря папкам layout-land и layout.Все, что вам нужно сделать, это добавить его в onCreate:

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

Здесь мы показываем или нет панель действий в зависимости от ориентации телефона

0 голосов
/ 29 марта 2018

Создайте экземпляр класса OrientationEventListener и включите его.

OrientationEventListener mOrientationEventListener = new OrientationEventListener(YourActivity.this) {
    @Override
    public void onOrientationChanged(int orientation) {
        Log.d(TAG,"orientation = " + orientation);
    }
};

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