onTabChanged (first_page) всегда вызывается, это ожидаемое поведение? - PullRequest
1 голос
/ 29 июля 2011

У меня есть 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);
}

Теперь у меня есть решение и вопросы:

  • Это ожидаемое поведение?
  • Есть ли лучшее решение для этого?

Спасибо за ваше внимание.

1 Ответ

0 голосов
/ 29 июля 2011

У нас нет кода, поэтому довольно сложно сказать точную причину, но вы, скорее всего, также вызываете setCurrentTab из onCreate.Когда вы возвращаетесь к действию, сначала вызываете setCurrentTab в методе onCreate, а затем вызывается setCurrentTab в методе onResume.

Если это не проблема, вам придется поделиться некоторым кодом, чтобыhelp.

На самом деле, вы всегда должны делиться соответствующими частями кода, иначе действительно трудно найти реальные проблемы.

...