【问题标题】:OnClickListener on Tabs not working选项卡上的 OnClickListener 不起作用
【发布时间】:2009-06-30 08:42:11
【问题描述】:

您好,

我试图在单击我的 TabActivity 的当前选定选项卡时获取 Click - 事件。 onTabChangedHandler 仅在选项卡更改时调用,而不是在单击当前活动选项卡时调用。调试器告诉我,我在 TabHost 中为 TabWidget 注册了 onClickListener。

我是否注册了错误的视图?

另外,我无法为选项卡创建上下文菜单,只能为其内容创建上下文菜单,是否与此问题有关?

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");
  }

【问题讨论】:

    标签: android onclick android-tabhost


    【解决方案1】:

    如果您想查看特定选项卡被点击,您需要将侦听器添加到选项卡本身,而不是 TabHost。

    选项卡实现中的视图层次结构是:

    • 标签主机
      • 标签小部件
        • (标签)
        • (标签)
      • 框架布局

    标签在运行时通过调用添加: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 );
            }
        }
    });
    

    【讨论】:

    • 当我尝试此操作时,它会更改选项卡,但不会更改选项卡下方的内容...有什么建议吗?
    【解决方案2】:

    使用setOnTabChangedListener 代替OnClickListener ;)

        static TabHost tabHost;
    
        tabHost = getTabHost();
    
    
        tabHost.setOnTabChangedListener(new OnTabChangeListener() {
           @Override
          public void onTabChanged(String arg0) {
           Log.i("******Clickin Tab number ... ", "" + tabHost.getCurrentTab());
          }     
    });  
    

    【讨论】:

    • 你不应该像以前一样调用一个超级方法来让标签“可点击”吗?当我添加此代码时,它单击时,鼠标会发光,但它不会在此选项卡上显示 listActivity。
    • 对不起,我的错误,就像炸弹一样,我有额外的代码正在进一步接管。
    • 我认为代码有错误...这里应该是getTabHost而不是Tabhost.....
    • 嗨 Chirag 实际上 tabhost 来自 getTabHost();看原帖,final TabHost tabHost = getTabHost();
    【解决方案3】:

    你的子句错了,用:

    ...

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

    ...

    【讨论】:

      【解决方案4】:

      进入我的代码,它显示了一些错误并要求我在 getTabWidget()、getTabHost() 等名称。等待您的 回应。

      试试这个

       tabHost.getTabHost().setCurrentTab(myTabIndex);
      

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 2017-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多