Заменить макет на изменение ориентации

В моем приложении есть веб-просмотр и некоторые кнопки внутри LinerLayout.

проблема в том, что я хочу, чтобы кнопки находились внизу в портретном режиме, а слева - в альбомном режиме, пока веб-просмотр сохраняет это состояние.

Два разных компоновки не работают, поскольку они заставляют восстанавливать активность, которая обновляет веб-представление. пока я использую android: configChanges = "orientation" в теге активности, поэтому веб-просмотр не обновляется при изменении ориентации.

Есть ли способ заменить расположение кнопок при изменении режима экрана?

enter image description here

портретный режим

enter image description here

пейзаж

Ответ 1

Я тестировал фрагменты, но обработка фрагмента делает вещи намного более сложными, и сам фрагмент нуждается в сохранении и восстановлении, которые могут не работать в веб-представлении с состоянием javascript. Поэтому я искал больше и нашел хорошую статью где-нибудь и с некоторыми изменениями Я пришел к решению, которое я предлагаю:

Сначала добавьте android:configChanges="orientation|screenSize|keyboard|keyboardHidden", чтобы приложение обрабатывало изменения конфигурации вместо android.

Сделайте два разных макета для пейзажа и портрета. В обоих макетах вместо веб-просмотра установите FrameLayout, который действует как заполнитель для веб-просмотра.

Определите такой метод initUI и поместите все, что связано с инициализацией UI в этом методе:

public void initui()
{
    setContentView(R.layout.main);
    if (wv == null) wv = new WebView(this);
    ((LinearLayout)findViewById(R.id.webviewPlace)).addView(wv);
    findViewById(R.id.home).setOnClickListener(this);
}

Если веб-просмотр еще не существует, он будет создан, и после setContentView(R.layout.main) он будет добавлен в макет. После этого вам понадобится другая настройка пользовательского интерфейса.

и в onConfigurationChanged:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    ((LinearLayout)findViewById(R.id.webviewPlace)).removeAllViews();
    super.onConfigurationChanged(newConfig);
    initUI();
}

В onConfigChange веб-просмотр удаляется из старого заполнителя и будет вызываться initui, который добавит его обратно в новый макет.

В oncreate() вызовите initui(), чтобы ui был инициализирован в первый раз.

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    initUI()
}

Я бы хотел, чтобы это было полезно для кого-то.

Ответ 2

поставьте это на layout-land для макетов, которые вы хотите использовать как ландшафт.

Идея заключается в том, что вы не должны использовать configChange="orientation", потому что она имеет свои недостатки. Вы можете найти подробный пост здесь. Вы должны вручную обработать свое состояние, если хотите изменить свой макет. Конечно, вы можете программировать это, но если вы хотите использовать xml для этого. Вы можете поддерживать webView с фрагментами.

Ответ 3

Попробуйте использовать этот код:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.activity_splash);
    }

Ответ 4

Если вы используете android:configChanges="orientation|screenSize"

В манифесте он игнорирует XML в " макет-земля". Если вы создаете другой XML для ландшафта, не используйте тег android:configChanges="orientation|screenSize" для этой активности в манифесте.

Ответ 5

Сделайте свой вид относительной компоновкой. Когда меняется ориентация, просто изменяйте параметры макета для каждого вида в коде. Пусть ваши кнопки будут содержаться в линейном макете

Как в..

Портрет

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
buttonLinearLayout.setLayoutParams(lp);


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ABOVE, R.id.buttons);
webView.setLayoutParams(webParams);

Пейзаж

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
buttonLinearLayout.setOrientation(LinearLayout.VERTICAL);
buttonLinearLayout.setLayoutParams(lp);


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons);
webView.setLayoutParams(webParams);

Убедитесь, что используемые вами LayoutParams являются параметрами RelativeLayout (всегда используйте Layoutparams родительского представления)

Ответ 6

Вы можете добавить значения - (конфигурация, которая вам нужна - например, земля, портрет) под ресурсами, и указать макет, который вам нужен для этой конфигурации.. Это так просто.

Пожалуйста, ознакомьтесь с приведенной ниже ссылкой для получения дополнительной информации: http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters