Изменение вкладки при повороте экрана [Android] - PullRequest
2 голосов
/ 15 апреля 2011

Привет, у меня есть Android-приложение с 4 вкладками (скажем, tab1, tab2, tab3, tab4).Когда начинается активность, вкладкой по умолчанию является tab1.Затем я переключаюсь на любую другую вкладку (tab2, 3 или 4) и меняю ориентацию экрана, и она всегда сбрасывается на вкладку по умолчанию (tab1).

Я пытался с помощью следующего кода:

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

А внутри createView () у меня есть:

private void createView()
{
... // Tabs are created before
tabHost.getTabWidget().setCurrentTab(CurrentTab);
}

CurentTab является частным int и по умолчанию установлено на0, но он установлен на TabChange:

public void onTabChanged(String tabId) {
    ... some code
    CurrentTab = tabHost.getCurrentTab();
}

Я сложен здесь ... Есть ли другой способ решить эту проблему?

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

Ответы [ 3 ]

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

Проблема в том, что при изменении конфигурации, например при повороте экрана, текущая активность уничтожается и воссоздается. В случае действия вкладки это включает само действие вкладки, а также действия каждой вкладки.

Таким образом, когда он воссоздан, он просто показывает первую вкладку, так как не имеет никакой другой информации.

Чтобы исправить это, вы можете переопределить onRetainNonConfigurationInstance() вашей активности вкладки и вернуть текущую выбранную вкладку. В on onCreate действия вкладки вы тогда вызываете getLastNonConfigurationInstance(), который возвращает объект, который вы вернули в onRetainNonConfigurationInstance (). Если объект нулевой, вы знаете, что не было никакого изменения ориентации, поэтому вы просто выбираете первую вкладку, если она не нулевая, то был поворот экрана, и вы можете использовать возвращенное значение, чтобы решить, какая вкладка была выбрана ранее, и установить это снова.

2 голосов
/ 29 августа 2013

Чтобы развернуть вопрос Ответ Фло - Метод активности onRetainNonConfigurationInstance() устарел с тех пор, как Honeycomb 3.2 (API 13):

Этот метод устарелна уровне API 13.
Вместо этого используйте новый Fragment API setRetainInstance(boolean);это также доступно на старых платформах через пакет совместимости Android.

Упрощает использование, ИМХО.

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

, поэтому вы должны реализовать это путем переопределения onSaveInstanceState (Bundle) в вашей активности

coz, когда действие поворота экрана воссоздается

РЕДАКТИРОВАТЬ:

protected void onSaveInstanceState (Bundle outState){
    outState.putInt("LastTab", tabHost.getCurrentTab());
}


protected void onCreate (Bundle savedInstanceState){
  super.onCreate (savedInstanceState);
  //...tabs creation
  // u need to provide some code to check if "LastTab" exists in savedState
  tabHost.getTabWidget().setCurrentTab(savedInstanceState.getInt("LastTab"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...