У меня возникли проблемы с настройкой ландшафтного режима в моем приложении.
У меня есть папка /res, содержащая папку макета и папку с макетами
layout
-----main.xml
layout-land
-----main.xml
My/layout-land/main.xml содержит различные элементы пользовательского интерфейса, чем /layout/main.xml. Как я могу правильно сопоставить каждый макет, когда пользователь переключился в альбомный режим и наоборот?
В основном я показываю полноэкранный ImageView, когда пользователь переключается в альбомный режим. ImageView загрузит изображение из Интернета и отобразит его. Возвращаясь к портрету, нужно просто вернуться в мой портретный режим, у которого есть другой набор компонентов пользовательского интерфейса.
Я получаю сбой при переключении в альбомный режим:
потому что я не могу получить id:
chartImageViewLandscape = (ImageView) this.findViewById(R.id.chartImageViewLandscape);
chartImageViewLandscape находится в /layout -land/main.xml
Как я могу получить ссылку на это?
Sheehan, относительно onRetainNonConfigurationInstance(), ниже - это то, что я сейчас делаю для своего приложения. У меня такое чувство, что я слишком сильно его обескураживаю, я думаю, что есть более простой способ; однако в настоящее время это отлично подходит для меня:
Итак, в моем классе активности "RotationMenu.java":
private Object catcher;
//lots of non-related code here
//directoryList is a returned list of selected directories, that I wish to
//retain in the event of an orientation state change.
String[] directoryList = new String[arrayList.size()];
arrayList.toArray(directoryList);
//here, I set the class Object catcher to the directoryList
catcher = directoryList;
//rest of non-related code
//this method is called when the orientation changes (for me,
//when I open my Droid hardware keyboard)
public Object onRetainNonConfigurationInstance()
{
//If I've entered anything into my catcher Object, it will be kept
//across orientation changes.
final Object data = catcher;
return data;
}
Теперь, в моем методе onCreate (Bundle savedInstanceState):
//We retrieve the stored Object and cast it to a String array
final Object recipient = (String[]) getLastNonConfigurationInstance();
//in case the state changes again before the code that sets the directories is run
catcher = recipient;
//if there was any stored data, we can now reinstate the list adapter where the
//directoryList was originally being used.
if(recipient != null)
{
returnedDirectories.setAdapter(new ArrayAdapter<String>(
this.getBaseContext(),
R.layout.simple_list_item_small,
(String[])recipient));
}
Опять же, я так делаю это сейчас. Если кто-нибудь знает более эффективный метод, во что бы то ни стало комментировать.:)
В чем именно вопрос?
Определяете ли вы android:orientation
в обоих ваших макетах? Кроме того, больше нечего делать. Android будет переключаться сам по себе.
Если у вас разные компоненты пользовательского интерфейса, вы, вероятно, захотите еще объявить их в обоих макетах, чтобы любой вызов findViewById
не разбивал ваше приложение. Просто создайте макет так, чтобы они не отображались (например, в FrameLayout, за изображением)
Если вы предпочитаете делать это более вручную, вам нужно поместить android:configChanges="orientation"
в манифест и реализовать onConfigurationChanged
Перейдите в файл манифеста Android "manifest" и убедитесь, что в разделе "Активность" присутствует следующее:
android:configChanges="orientation|screenSize|keyboardHidden"
Ваш последний раздел "активность" манифеста должен выглядеть примерно так:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Это из активности AdMob и имеет больше параметров, например. screenSize для Android 3.2 +
<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>