Я создаю приложение для потокового видео.Он имеет макет в стиле Youtube, с портретным макетом, показывающим видео вверху и список другого контента внизу.Приложение может показывать видео в полноэкранном режиме в альбомной ориентации, поворачивая устройство или нажимая кнопку.
Теперь, если я поверну телефон в альбомную ориентацию, а затем поверну его обратно в портретную ориентацию, раскладка вернется назад.к портрету, как и ожидалось.Если вместо этого я нажимаю кнопку, чтобы включить режим портрета, поворачиваю устройство в альбомной ориентации, чтобы просмотреть видео, а затем поворачиваю его обратно в портретную ориентацию, макет остается застрявшим в альбомной ориентации.
Моя деятельность в манифесте:
<activity
android:name="MyActivity"
android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:label="@string/app_name"
android:launchMode="singleTask" />
Мой щелчок по кнопке:
mChangeOrientButton.setOnClickListener((OnClickListener)(new OnClickListener() {
public final void onClick(View it) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}
}));
Мой метод onConfigurationChanged (я заметил, что если я нажимаю кнопку, а затем поворачиваю телефон, этот метод больше не вызывается, показапрашиваемая ориентация остается настроенной на что-то отличное от НЕУКАЗАННОЕ):
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
{
// Set the layout for landscape mode
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Set the layout for portrait mode
}
}
Я попытался сбросить запрашиваемую ориентацию на НЕУКАЗАННОЕ, как это:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
{
// Set the layout for landscape mode
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Set the layout for portrait mode
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
, но это не работает, потому что ориентацияпринудительно переключается из портретного в ландшафтное, а затем снова устанавливается в неопределенное, прежде чем пользователь сможет повернуть его в альбомную ориентацию, поэтому он сразу же снова меняется на портретную, и кажется, что он ничего не делает.