У меня есть TabActivity с 3 вкладками.Я сохраняю номер последней выбранной страницы в общем предпочтении
и возвращаю его обратно на Resume для вызова tabHost.setCurrentTab()
.
Но onTabChanged()
вызывается дважды при выборе, кроме первой
страницы.
- Вызов
tabHost.setCurrentTab(0)
вызывает onTabChanged
один раз.Это ожидается. - При вызове
tabHost.setCurrentTab(1 or above)
дважды вызывается onTabChanged
с указанием первой страницы и ожидаемой страницы.Это не то, что я ожидал.
Я запускаю его на OS2.3.3.
Это ожидаемое (разработанное) поведение?(Я предпочитаю, чтобы onTabChanged
вызывался только один раз, чтобы
предотвращал нежелательную обработку для первой страницы. Если это спроектированное поведение, мне нужно подумать
о некоторой логике, чтобы игнорировать нежелательный вызов onTabChanged.
)
РЕДАКТИРОВАТЬ
Фрагмент кода в onCreate ().
tabHost = getTabHost();
tabHost.setOnTabChangedListener(new TabChangedListener());
TabSpec firstTab = tabHost.newTabSpec("First")
.setIndicator(firstButton)
.setContent(R.id.first_content);
tabHost.addTab(firstTab);
TabSpec secondTab = tabHost.newTabSpec("Second")
.setIndicator(secondButton)
.setContent(R.id.second_content);
tabHost.addTab(secondTab);
TabSpec thirdTab = tabHost.newTabSpec("Third")
.setIndicator(thirdButton)
.setContent(R.id.third_content);
tabHost.addTab(thirdTab);
И код в onResume ().
int tabIndex = PreferenceManager.getDefaultSharedPreferences(this).getInt(ADDRESS_TAB_KEY,0);
tabHost.setCurrentTab(tabIndex);
И OnTabChangeListener.
class TabChangedListener implements OnTabChangeListener
{
public void onTabChanged(String tabId)
{
Log.d(TAG,"onTabChanged " + tabId);
if(tabId.equals("First") == true)
{
setupView(0);
}
else if(tabId.equals("Second") == true)
{
setupView(1);
}
else if(tabId.equals("Third") == true)
{
setupView(2);
}
}
}
Я обнаружил, что onTabChanged () вызывается до вызова onResume ()!Когда я переместил строку, вызывающую tabHost.setOnTabChangedListener () после вызова tabHost.addTab (), onTabChanged () не был вызван из onCreate (), что кажется понятным.Но в этом случае вызов tabHost.setCurrentTab (0) вообще не вызовет onTabChanged!Это нелепо.Так что я закончил с этим решением.
1) Вызвать tabHost.setOnTabChangedListener после вызова tabHost.addTab ().
2) Витой код onResume (), как показано ниже.
int tabIndex = PreferenceManager.getDefaultSharedPreferences(this).getInt(ADDRESS_TAB_KEY,0);
if(tabIndex == 0)
{
setupView(0); // setup view since onTabChanged won't be called
}
else
{
tabHost.setCurrentTab(tabIndex);
}
Теперь у меня есть решение и вопросы:
- Это ожидаемое поведение?
- Есть ли лучшее решение для этого?
Спасибо за ваше внимание.