OnClickListener на вкладках не работает - PullRequest
8 голосов
/ 30 июня 2009

Привет,

Я пытаюсь получить событие Click - при нажатии на выбранную в данный момент вкладку моей TabActivity. OnTabChangedHandler вызывается только всякий раз, когда вкладка изменяется, а не если нажата текущая активная вкладка. Отладчик говорит мне, что я зарегистрировал onClickListener для TabWidget в моем TabHost.

Я регистрируюсь для неправильного просмотра?

Кроме того, я не могу создать контекстное меню для вкладок, только для его содержимого, связана ли эта проблема?

public class TestDroidViewTab extends TabActivity 
                              implements TabContentFactory
                              , OnTabChangeListener, OnClickListener {

  private static final String LOG_KEY = "TEST";
  ListView listView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      final TabHost tabHost = getTabHost();


      TabHost.TabSpec ts = tabHost.newTabSpec("ID_1");
      ts.setIndicator("1"); 
      ts.setContent(this);
      tabHost.addTab(ts);

      ts = tabHost.newTabSpec("ID_2");
      ts.setIndicator("2"); 
      ts.setContent(this);
      tabHost.addTab(ts);

      ts = tabHost.newTabSpec("ID_3");
      ts.setIndicator("3"); 
      ts.setContent(this);
      tabHost.addTab(ts);
      tabHost.setOnClickListener(this);
      tabHost.setOnTabChangedListener(this);
  }
  public void onClick(View v) {
      Log.d(LOG_KEY, "OnClick");
  }

  public void onTabChanged(String tabId) {
      Log.d(LOG_KEY, "OnTabChanged");
  }

Ответы [ 4 ]

19 голосов
/ 21 мая 2010

Если вы хотите увидеть, что нажата определенная вкладка, вам нужно добавить слушателя к самой вкладке, а не к TabHost.

Иерархия представлений в реализации вкладки:

  • TabHost
    • TabWidget
      • (вкладка)
      • (вкладка)
    • FrameLayout

Вкладки добавляются во время выполнения по телефону: tabHost.addTab(tabHost.newTabSpec(""));

Затем вы можете получить указатель на отдельные вкладки, позвонив по номеру: getTabWidget().getChildAt(4);

По сути, вы добавляете OnClickListener к дочернему элементу TabWidget. Теперь вы можете подобрать клики на отдельной вкладке. Однако это переопределит поведение по умолчанию, которое изменяет содержимое при нажатии на вкладку. Таким образом, чтобы ваш контент изменился, ваш OnClickListener должен сделать это за вас.

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

final String myTabTag = "My Tab";
final int myTabIndex = 3;

getTabHost().addTab( getTabHost().newTabSpec(myTabTag) );

getTabWidget().getChildAt(myTabIndex).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (getTabHost().getCurrentTabTag().equals(myTabTag)) {
            getTabHost().setCurrentTab(myTabIndex );
        }
    }
});
10 голосов
/ 05 февраля 2010

используйте setOnTabChangedListener вместо OnClickListener;)

    static TabHost tabHost;

    tabHost = getTabHost();


    tabHost.setOnTabChangedListener(new OnTabChangeListener() {
       @Override
      public void onTabChanged(String arg0) {
       Log.i("******Clickin Tab number ... ", "" + tabHost.getCurrentTab());
      }     
});  
2 голосов
/ 21 июня 2010

Ваш пункт неверен, используйте:

...

if (getTabHost().getCurrentTabTag().equals(myTabTag) == false) {
            getTabHost().setCurrentTab(myTabIndex );
   }

...

0 голосов
/ 31 мая 2013

в мой код, он показывает некоторые ошибки и просит меня создать новые методы в такие имена, как getTabWidget (), getTabHost () и т. д. В ожидании вашего ответ.

Попробуйте это

 tabHost.getTabHost().setCurrentTab(myTabIndex);
...