Android, вопрос ориентации с Tabhost и это очень странно

все.

Я создал Tabhost и на нем 4 кнопки.

Я устанавливаю android:configChanges="orientation|keyboardHidden" для каждого действия в файле манифеста.

И я также переопределяю метод onConfigurationChanged для прослушивания события, когда экран ориентирован.

Теперь есть «Баг», и я не знаю, как его решить.

Когда я нажимаю одну из 4 кнопок (например, A, B, C и D) и меняю ориентацию планшета с книжной на альбомную, активность работает нормально. Его метод onConfigurationChanged работает.

Но когда я нажимаю кнопку B в ландшафтном режиме, ее портретное состояние по-прежнему сохраняется (я хочу, чтобы вызывался метод onConfigChanged кнопки B, но это не так). Одним словом, если вы изменили ориентацию и нажали другую кнопку Tab, метод onConfigurationChanged Activity вызываться не будет.

Как я могу решить эту проблему? Большое спасибо.


person Jarkid    schedule 21.07.2011    source источник
comment
что меняется при смене вкладок? вы открываете другую деятельность? открыть страницу в веб-просмотре? не могли бы вы дать больше информации...   -  person Gligor    schedule 21.07.2011
comment
не могли бы вы также опубликовать код для вашей функции onCofigurationChanged, пожалуйста?   -  person Gligor    schedule 21.07.2011
comment
Это пример моего onConfigurationChanged @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); если (getScreenOrientation() == Configuration.ORIENTATION_PORTRAIT) { content.setImageResource(R.drawable.how_portrait); } еще { content.setImageResource (R.drawable.how_landscape); } }   -  person Jarkid    schedule 21.07.2011


Ответы (4)


Вы не можете вызвать onConfigChanged() для просмотра или любого обратного вызова, он вызывается только с устройства, насколько я знаю. У меня нет идей, кроме этого комментария.

person Nikola Despotoski    schedule 21.07.2011

Попробуйте удалить строку:

super.onConfigurationChanged(newConfig);

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


Однако лучший способ сделать то, что вы пытаетесь сделать, - это поместить чертежи в правильные каталоги ваших ресурсов и использовать одно и то же имя для обоих. Таким образом, вам не нужно будет указывать, что можно использовать для другой конфигурации, а лучше оставить ОС Android делать это за вас. Поместите один в каталог drawable, а другой в drawable-land или drawable-port в зависимости от ориентации по умолчанию. Подробнее о том, как предоставлять ресурсы и указывать, когда они используются, можно прочитать здесь Предоставление ресурсов

person Gligor    schedule 21.07.2011

Спасибо за ответы. Теперь я, наконец, знаю, что не так с моей программой.

Поскольку я использовал TabHost, при изменении ориентации экрана будет вызываться только два метода Activity onConfigurationChanged.

Например, есть Activity, которое является контейнером для TabHost. И есть еще четыре действия (A, B, C и D), которые являются частями действия TabHost.

Поэтому, когда ориентация экрана изменяется с помощью Activity A, будет вызываться только метод onConfigurationChanged TabHost и Activity A. Других вызывать НЕ будут.

Вот почему, когда экран меняется с портретного на альбомный. OnConfiguration A изменен, но когда вы нажимаете кнопку других вкладок, B, C и D не будут изменены (по-прежнему выглядят как портрет в ландшафтном режиме).

Таким образом, ответ таков: вы должны контролировать метод конфигурации в TabHost Activity. И теперь это работает хорошо.

Если вы используете Tabhost, вы должны это заметить.

person Jarkid    schedule 24.07.2011

Нашел решение похожей проблемы.

Я использую tabhost и хочу, чтобы 3 из 4 вкладок могли вращаться, а 1 вкладка была настроена только на портретный режим. Ранее (до применения этого исправления) 3 вкладки вращались до тех пор, пока не была выбрана фиксированная вкладка портретной ориентации, после чего все они зависали в портретном режиме.

Мне пришлось настроить другие вкладки, чтобы использовать ориентацию ПОЛЬЗОВАТЕЛЯ, чтобы исправить это. то есть добавил setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); в onResume других 3 вкладок, и теперь он работает именно так, как я предполагал. 3 вкладки теперь будут поворачиваться в зависимости от ориентации пользователя на устройстве, а 1 вкладка имеет фиксированную портретную ориентацию. :)

person Kyle Clegg    schedule 21.11.2011