2010-12-02 61 views
35

我想找到方法能够触发一个标签上的onclick事件当这个标签是当前选项卡。Android的TabWidget检测点击当前标签

我确实尝试过这种方式(其他几种),但没有成功。

public void onTabChanged(String tabId) { 
    Log.d(this.getClass().getName(), ">>>>>>>>>>>>>>>>>>>>>>>> tabId: " + tabId); 

    int tabs = getTabWidget().getChildCount(); 
    Log.d(this.getClass().getName(), "tabs: " + tabs); 
    for(int i=0; i<tabs; i++){ 
     View tab = getTabWidget().getChildAt(i); 
     if(i==tabHost.getCurrentTab()){ 
      Log.d(this.getClass().getName(), "tab: " + i); 
      tab.setOnClickListener(this); 
     }else{ 
      tab.setOnClickListener(null); 
      tab.getOnFocusChangeListener(); 
     } 
    } 
} 

的一点是,我设置了onClickListenernull所以,下一次我点击一个标签什么也没有发生,但我想有正常标签的行为。

外面有什么想法吗?

+0

“我试图找到方法能够在此选项卡是当前选项卡上触发选项卡上的onclick事件。” - 这不是一种非常容易发现的UI模式。用户不希望在当前选项卡上点按任何内容。我鼓励你重新考虑你的方法。 – CommonsWare 2010-12-02 18:03:01

+3

我同意你的意见,我的客户不会收到:/ – 0m4r 2010-12-03 07:16:41

+0

我有类似的情况,每个标签都有用户的说明,我希望他们能够再次单击标签,以便再次显示说明。我想这是一个不寻常的模式,但它是我认为唯一可以轻松查看的方向 – 2011-09-20 22:05:46

回答

20

我想我已经找到了解决办法,这里有个示例代码:

intent = new Intent(this, HomeGroup.class); 
    View tab1 = _inflater.inflate(R.layout.custom_tab_1,null); 
    homeTab.setTag("Tab1"); 
    spec = tabHost.newTabSpec("Tab1").setIndicator(tab1).setContent(intent); 
    tabHost.addTab(spec); 

    View tab2 = _inflater.inflate(R.layout.custom_tab_2,null); 
    homeTab.setTag("Tab2"); 
    spec = tabHost.newTabSpec("Tab2").setIndicator(tab2).setContent(intent); 
    tabHost.addTab(spec); 

    View tab3 = _inflater.inflate(R.layout.custom_tab_3,null); 
    homeTab.setTag("Tab3"); 
    spec = tabHost.newTabSpec("Tab3").setIndicator(tab3).setContent(intent); 
    tabHost.addTab(spec); 

    tabHost.setOnTabChangedListener(this); 

    //click on seleccted tab 
    int numberOfTabs = tabHost.getTabWidget().getChildCount(); 
    for(int t=0; t<numberOfTabs; t++){ 
     tabHost.getTabWidget().getChildAt(t).setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if(event.getAction()==MotionEvent.ACTION_UP){ 

        String currentSelectedTag = MainTab.this.getTabHost().getCurrentTabTag(); 
        String currentTag = (String)v.getTag(); 
        Log.d(this.getClass().getSimpleName(), "currentSelectedTag: " + currentSelectedTag + " currentTag: " + currentTag); 
        if(currentSelectedTag.equalsIgnoreCase(currentTag)){ 
         MainTab.this.getTabHost().setCurrentTabByTag(currentTag); 
         String newSelectedTabTag = MainTab.this.getTabHost().getCurrentTabTag(); 
         if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){ 
          //do smthg 
         }else if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){ 
          //do smthg 
         }else if(newSelectedTabTag.toLowerCase().indexOf("tab3")!=-1){ 
          //do smthg 
         } 
         return true; 
        } 
       } 
       return false; 
      } 
     }); 
    }  

也许有可能改善它,但这对我来说可行!

14

丑陋的修复:在onClickListener放: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); 其他选项卡的索引我在选项卡下使用我最简单的视图。

P.S.客户总是希望他们的应用程序是不同的:)

这是我使用的(我只有2个选项卡TAB1和TAB2)代码:

getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.d(TAG,"1"+getTabHost().getCurrentTabTag()); 

       if (getTabHost().getCurrentTabTag().equals("Tab2")) { 
        Log.d(TAG,"2"); 

        tabHost.setCurrentTab(0);          
        tabHost.setCurrentTab(1); 

       } else { 
        tabHost.setCurrentTab(1); 
       } 
      } 
     }); 
+0

你是什么意思与“其他标签索引我在标签下使用我最简单的视图。”? – 0m4r 2010-12-04 18:11:26

+0

我一直在尝试你的解决方案,但我仍然有* overrriding *选项卡上的默认onClick事件*覆盖*默认行为...并将其设置为null删除onClick事件......所以,感谢您的帮助,但我认为我不能使用您的解决方案,除非我重写了该标签的整个onClick事件:/ – 0m4r 2010-12-05 11:35:54

+0

我已经添加了一些示例代码。 – 2010-12-10 09:17:01

50

gothrough的标签听众许多解决方案之后,我发现很简单的解决方案...

getTabHost().setOnTabChangedListener(new OnTabChangeListener() { 

@Override 
public void onTabChanged(String tabId) { 

int i = getTabHost().getCurrentTab(); 
Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i); 

    if (i == 0) { 
      Log.i("@@@@@@@@@@ Inside onClick tab 0", "onClick tab"); 

    } 
    else if (i ==1) { 
      Log.i("@@@@@@@@@@ Inside onClick tab 1", "onClick tab"); 
    } 

    } 
}); 
23

很多思考这样的后,溶液结束了,比我想象中的简单。我所做的只是创建一个扩展TabHost一个新的子类,并重写setCurrentTab方法,像这样:

package com.mycompany.Views; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.TabHost; 
import android.widget.Toast; 

public class ReclickableTabHost extends TabHost { 

    public ReclickableTabHost(Context context) { 
     super(context); 
    } 

    public ReclickableTabHost(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public void setCurrentTab(int index) { 
     if (index == getCurrentTab()) { 
      // FIRE OFF NEW LISTENER 
     } else { 
      super.setCurrentTab(index); 
     } 
    } 
} 

要改用典型TabHost的新类只需编辑与您的布局xml文件:

<FrameLayout 
    android:layout_height="match_parent" 
    android:layout_width="0dip" 
    android:layout_weight=".8"> 

    <com.myCompany.Views.ReclickableTabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:visibility="gone"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <TabWidget 
       android:id="@android:id/tabs" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:background="@drawable/tab_unselected_holo"/> 
      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
      </FrameLayout> 

     </LinearLayout> 

    </com.myCompany.Views.ReclickableTabHost> 

希望这有助于...

1
mTabHost.setOnTabChangedListener(new OnTabChangeListener() { 

     @Override 
     public void onTabChanged(String tabId) { 

      int i = mTabHost.getCurrentTab(); 
      mTabHost.getTabWidget().getChildAt(i) 
        .setBackgroundColor(Color.parseColor("#014a68")); 

      //int m = mTabHost.getChildCount(); 
      for (int j = 0; j <=3; j++) { 
       if (j != i) 
        mTabHost.getTabWidget() 
          .getChildAt(j) 
          .setBackgroundColor(Color.parseColor("#000000")); 
      } 


     } 
    }); 
5

这里的问题是,setOnTabChangedListener不选定的选项卡上单击时如果设置火了,在选项卡上,您将失去正常的选项卡行为。

所以一个简单的解决方案是将OnClickListener放在选项卡上,并在其内部以编程方式设置这是当前选项卡。

随着TabHost

getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // custom code 
     tabHost.setCurrentTab(0);          
    } 
}); 

随着TabLayout

tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
        // custom code 
        TabLayout.Tab tab = tabLayout.getTabAt(0); 
        tab.select(); 
       } 
      } 
     }); 
3

如果你想尝试android.support.design.widget。TabLayout,就可以实现这样的:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
    @Override public void onTabSelected(Tab tab) { 

    } 

    @Override public void onTabUnselected(Tab tab) { 

    } 

    @Override public void onTabReselected(Tab tab) { 

    } 
}); 
0

如果你有一个自定义标签布局,您可能需要在您的自定义视图中添加这种,它解决了我的问题:

android:duplicateParentState="true" 
0

这是为我工作......

TabHost host = (TabHost)findViewById(R.id.tabHost); 

host.setOnTabChangedListener(new OnTabChangeListener() { 
    @Override 
    public void onTabChanged(String tabId) { 

     int i = host.getCurrentTab(); 

     if (i == 0) { 
      // your method 1 
     } 
     else if (i ==1) { 
      // your method 2 
     } 
    } 
});