Вид макета не обновляется при изменении ориентации в Android - PullRequest
9 голосов
/ 15 апреля 2011

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

Мой манифест настроен на: android:configChanges="keyboardHidden|orientation" для действия.

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

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

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

Когда я НАЧИНАЮ Activity в режиме порта или земли, компоновка представления верна (согласно моим res/layout-???? файлам).

Но когда я уже вActivity, и я поворачиваю телефон, тогда мой макет просмотра не изменяется.Экран поворачивается, и 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 & createANewActivity "

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

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

Ответы [ 2 ]

8 голосов
/ 15 апреля 2011

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

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.flipper);
    flipper = (ViewFlipper) findViewById(R.id.flipper);
}
0 голосов
/ 15 апреля 2011

поместите это в свой манифест Androidandroid: configChanges = "direction"

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

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


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


    }
...