Приложение вылетает при переключении на альбомную планировку

1

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

У меня есть папка /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

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

Теги:
layout
orientation

4 ответа

1
Лучший ответ

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

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

  • 0
    Я постараюсь реализовать это в своем собственном коде! Знаете ли вы, как я могу извлечь chartImageViewLandscape из моего /layout-land/main.xml? Похоже, это всегда ноль!
  • 0
    Насколько я понимаю, вы не хотите хранить объект View, что приведет к утечкам памяти. Вместо этого сохраните растровое изображение или чертеж, который содержится в ImageView, а затем установите его обратно в представление chartImageViewLandscape в методе onCreate ().
Показать ещё 8 комментариев
1

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

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

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

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

  • 0
    Звучит хорошо. Кроме того, поскольку загрузка происходит из Интернета при изменении конфигурации, вы обязательно должны найти способ сохранить изображение между изменениями ориентации (для одного из них я использовал onRetainNonConfigurationInstance () для сохранения объекта и getLastNonConfigurationInstance () для восстановления изображения), чтобы оно не пыталось перезагружать изображение каждый раз, когда оно переходит от портрета к пейзажу и наоборот.
  • 0
    обновлено с более подробной информацией о моей проблеме. @kcoppock Можете ли вы показать мне пример вашего onRetainNonConfigurationInstance ()?
0

Перейдите в файл манифеста 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>
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню