Приложение вылетает при переключении на альбомную разметку - PullRequest
1 голос
/ 03 сентября 2010

У меня проблемы с настройкой ландшафтного режима в моем приложении.

У меня есть папка / res, которая содержит папку с макетом и папку с компоновкой

layout
-----main.xml

layout-land
-----main.xml

Мой /layout-land/main.xml содержит элементы пользовательского интерфейса, отличные от /layout/main.xml. Как правильно сопоставить каждый макет, когда пользователь переключился в ландшафтный режим и наоборот?

Я в основном отображаю полноэкранный режим ImageView, когда пользователь переключается в ландшафтный режим. ImageView загрузит изображение из Интернета и отобразит его. Переключение обратно в портретный режим должно просто вернуться в мой портретный режим, который имеет другой набор компонентов пользовательского интерфейса.

При переключении в ландшафтный режим происходит сбой:

потому что я не могу получить идентификатор:

chartImageViewLandscape = (ImageView) this.findViewById(R.id.chartImageViewLandscape);

chartImageViewLandscape находится в /layout-land/main.xml

Как я могу получить ссылку на это?

Ответы [ 4 ]

1 голос
/ 04 сентября 2010

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's 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 (BundlevedInstanceState):

//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));
}

Опять же, так я сейчас и делаю.Если кто-нибудь знает более эффективный метод, обязательно прокомментируйте.:)

1 голос
/ 03 сентября 2010

В чем именно вопрос?

Определяете ли вы android:orientation в обеих ваших раскладках?Кроме того, больше ничего не нужно делать.Android переключится сам по себе.

Если у вас разные компоненты пользовательского интерфейса, вы, возможно, захотите объявить их в обоих макетах, чтобы любой вызов findViewById не приводил к сбою вашего приложения.Просто сделайте макет таким образом, чтобы он не отображался (например, в FrameLayout, позади изображения)

Если вы предпочитаете делать это более вручную, вам нужно добавить android:configChanges="orientation" в манифест и внедрить onConfigurationChanged

0 голосов
/ 07 января 2017

Перейдите в XML-файл манифеста Android и убедитесь, что в разделе «Активность» присутствует следующее:

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>
0 голосов
/ 19 января 2012

Это из активности AdMob и имеет больше параметров, например screenSize для Android 3.2 +

<activity android:name="com.google.ads.AdActivity"
              android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
...