Макет просмотра не обновляется при изменении ориентации в Android

Я хотел бы, чтобы мой макет VIEW был скорректирован при изменении ориентации.

Мой манифест настроен с помощью: android:configChanges="keyboardHidden|orientation" в действии.

У меня res/layout-land, res/layout-port.

У меня есть onConfigurationChanged в моем Activity (он вызывается при ротации).

В моем Activity есть ViewFlipper, а внутри него LinearLayouts.

Когда я ЗАПУСКАЮ Activity в портовом или наземном режиме, макет View правильный (согласно моим res/layout-???? файлам).

Но когда я уже в Activity и поворачиваю телефон, то у меня раскладка View не меняется. Экран повернут, и onCreate активности не вызывается, как положено, onConfigurationChanged вызывается в Activity, но экран всегда перерисовывается с LinearLayout, который был загружен при запуске Activity.

У меня ощущение, что я что-то упускаю в onConfigurationChanged, но не знаю что. Думаю, мне нужно вызвать какую-то функцию для ViewFlipper или LinearLayout внутри. Какие функции я должен вызывать?

ViewFlipper flipper;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    flipper = new ViewFlipper(getApplicationContext());
    setContentView(flipper);
    initLayout();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(flipper);
}

void initLayout() {
    MyView myview = createMyView(0);
    flipper.addView(myview, 0);
    myview = createMyView(1);
    flipper.addView(myview, 1);
    myview = createMyView(1);
    flipper.addView(myview, 1);
}

Я пытался добавить flipper = new ViewFlipper(getApplicationContext()); к onConfigurationChanged(), но после поворота все стало черным. Я думаю, мне придется вызвать initLayout, но это будет пересчитывать все (и это именно то, чего я не хочу делать, и поэтому я пытаюсь сделать это с помощью onConfigurationChanged, в отличие от Android по умолчанию "dropMyActivity & создать новую активность"

РЕШЕНИЕ. Раньше я думал, что могу активировать обновление макета при повороте, но, похоже, мне нужно заново создать макет с текущим контекстом (после изменения ориентации)

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.category_flipper);
    ViewFlipper oldFlipper = viewFlipper;
    viewFlipper = (ViewFlipper)findViewById(R.id.categoryFlipper);
    for (int i = 0; i < 3; i++) {
        final CardLayout cl = new CardLayout(this, cardData[i]);
        viewFlipper.addView(cl);
    }
    cardData[viewIndex].restorePlayer();
    viewFlipper.setDisplayedChild(viewIndex);
    oldFlipper.removeAllViews();
}

person Gavriel    schedule 15.04.2011    source источник


Ответы (2)


Если flipper является ссылкой на представление, которое было изначально установлено, это и является причиной проблемы. Вам нужно передать идентификатор ресурса нужного вам макета, а не старый вид, который был до того, как телефон был повернут. После этого представление содержимого будет привязано к новому ресурсу. Может быть, что-то вроде этого (по модулю моих предположений о ваших идентификаторах ресурсов):

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.flipper);
    flipper = (ViewFlipper) findViewById(R.id.flipper);
}
person Ted Hopp    schedule 15.04.2011
comment
Хорошо, это кажется хорошим направлением, но мне еще нужно выяснить, как его подогнать к моему делу. Я добавлю еще немного кода к исходному вопросу. - person Gavriel; 17.04.2011
comment
@Flöcsy - я смотрю на initLayout, который содержит работу, которую вы говорите, что не хотите повторять, но похоже, что он просто снова создает все представления. Это именно то, что вам нужно сделать, чтобы сбросить отображение при повороте экрана. Если вы выполняете дорогостоящие вычисления одновременно с созданием представлений, и они действительно не зависят от конфигурации, вы можете захватить и повторно использовать их, как описано здесь - person Ted Hopp; 17.04.2011
comment
Тед, я думаю, ты прав. Хотя createMyView — дорогостоящая работа, но теперь я понял идею, и, вероятно, я делаю гораздо больше, чем должен (например, я анализирую zip-файл для поиска изображений (для отображения на ImageButton) и mp3-файлы (для воспроизведения при нажатии кнопки). - person Gavriel; 18.04.2011
comment
Вы можете сохранить ссылки на изображения, сохранив их как данные, не относящиеся к конфигурации. Вероятно, то же самое касается и файлов mp3. - person Ted Hopp; 18.04.2011

поместите это в свой манифест Android. андроид: configChanges = "ориентация"

в этом случае просто попробуйте это и установите макет...

    if (Intraday.this.getResources (). getConfiguration (). orientation == Configuration.ORIENTATION_PORTRAIT){ 


    }
    else if (Intraday.this.getResources (). getConfiguration (). orientation == Configuration.ORIENTATION_LANDSCAPE) {      


    }
person Siten    schedule 15.04.2011