Как обнаружить изменение ориентации в макете в Android?
Я только что реализовал функцию изменения ориентации - например, когда макет изменяется от портрета к ландшафту (или наоборот). Как я могу определить, когда событие изменения ориентации завершено.
на OrientationEventListener не работает. Как я могу получать уведомления о событиях изменения ориентации макета?
6 ответов:
использовать 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= "ориентация / screenSize" для API уровня 13 или выше.
надеюсь, что это поможет вам... :)
для загрузки макета в макет-земля папка означает, что у вас есть два отдельных макета, то вы должны сделать
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); }
просто хотел показать вам способ сохранить весь ваш пакет после onConfigurationChanged:
создать новый пакет сразу после вашего класса:
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"/>
переопределить метод действия onConfigurationChanged
использовать этот метод
@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>
создать экземпляр
OrientationEventListenerклассOrientationEventListener mOrientationEventListener = new OrientationEventListener(YourActivity.this) { @Override public void onOrientationChanged(int orientation) { Log.d(TAG,"orientation = " + orientation); }
Comments