问题 如何为相同的选项卡调用选项卡Onclick和OnTabChange


在我的项目中,我有两个选项卡和一个按钮。对于两个选项卡,我有两个活动和按钮调用不同的活动。事情是我在第一个标签上显示按钮的结果。即tab0在tab0Event和按钮点击事件上也是有效的。并且我能够使用tabHost.setOnTabChangedListener更改选项卡事件,但现在我还想要的是,假设我点击按钮所以现在按钮视图正在显示(tab0处于活动状态)但是再次如果我点击tab0,tab0活动应该是显示。

我尝试了许多点击标签的解决方案,一个是

getTabWidget().getChildAt(getTabHost().getCurrentTab()).setOnClickListener
      (new View.OnClickListener() {

      @Override public void onClick(View v) {
      System.out.println(getTabHost().getCurrentTab());

      } });

但是,当我使用tabChnageListner这个代码时,标签更改不起作用,我得到了非常意外的结果。 你能为我的问题建议解决方案。

谢谢。

用于更改选项卡的代码如下所示:(对于制表符更改工作正常,需要在其中添加Tab Onclick)

public class TabLayoutUsingTabChangeEventActivity extends TabActivity {

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);                
            final TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
            final TabHost.TabSpec sp1 = tabHost.newTabSpec("TAB1");
            TabHost.TabSpec sp2 = tabHost.newTabSpec("TAB2");

            //Creating First Tab
            Intent intent1 = new Intent(this, Tab1Activity.class);
            sp1.setIndicator("TAB1").setContent(intent1);
            tabHost.addTab(sp1);

            //Creating Second Tab 
            Intent intent2 = new Intent(this, Tab2Activity.class);
            sp2.setIndicator("TAB2").setContent(intent2);
            tabHost.addTab(sp2);               

            //Tab Changed Event
            tabHost.setOnTabChangedListener(new OnTabChangeListener(){
                 @Override
                 public void onTabChanged(String tabId) {
                     Log.i("TabId :", tabId);
                     if(tabId.equals("TAB2")){
                     Log.i("TAB1", "TAB1 Changed");
                     Intent intent1 = new Intent().setClass(getApplicationContext(), Tab1Activity.class);
                     sp1.setIndicator("TAB1").setContent(intent1);
                     tabHost.setCurrentTab(0);
                     }
                  }
            });

            Button addNewButton = (Button)findViewById(R.id.add_new_ticket_btn);
            addNewButton.setOnClickListener(new OnClickListener(){
                  @Override
                  public void onClick(View v) {
                     Intent in = new Intent().setClass(getApplicationContext(), AddNewTicketActivity.class);
                     sp1.setContent(in);
                     tabHost.setCurrentTab(0);
                     //startActivity(in);
                 }
            });               
      }
}

4679
2017-11-29 13:07


起源

请清楚地更新您的要求。它不清楚。 - Raj


答案:


您可以实现此侦听器:

    host.setOnTabChangedListener(new OnTabChangeListener()
    {
        @Override
        public void onTabChanged(String tabId)
        {
            if (getTabHost().getCurrentTabTag().equals("tab0"))
            {
                host.getCurrentTabView().setOnTouchListener(
                        new OnTouchListener()
                        {
                            @Override
                            public boolean onTouch(View v, MotionEvent event)
                            {
                                if (event.getAction() == MotionEvent.ACTION_DOWN)
                                {
                                    if (getTabHost().getCurrentTabTag().equals("tab0")
                                    {
                                        getTabHost().setCurrentTabByTag("tab1");
                                        getTabHost().setCurrentTabByTag("tab0");
                                    }
                                    return false;
                                }
                                return false;
                            }
                        });
            }
        }
    });

此外,当您为每个选项卡添加标签集标签时:

host.addTab(host.newTabSpec("tab0"));
host.addTab(host.newTabSpec("tab1"));

7
2018-01-09 20:19



绝对这是正确答案!!它完美无缺,并且setOnClickListener和setOnTabChangedListener没有任何问题。谢谢你的帖子!! - kiduxa


您可以使用Fragment进行布局


2
2018-01-10 03:25





你不能。 TabWidget中的视图已经具有onClickListener,并且它是正常工作流程所必需的。如果你删除它,你将破坏TabWidget的逻辑。

当您设置onClickListener时,您删除previuos onClickListener并断开TabWidget逻辑。

通常在这种情况下会创建复合单击侦听器(一个处理单击事件并调用另一个单击侦听器的单击侦听器)。但不是在你的情况下,因为没有办法获得旧的点击监听器,因为View没有getOnClickListener方法。

这是TabWidget源代码。 所有相关的值都是私有的...所以我们无法从这一方面解决问题。

实现目标的唯一方法是使用Reflection进行黑客攻击,因为它们允许读取私有变量。因此,在设置View的新onlick监听器之前,您应该使用旧的(使用Reflections),然后创建复合onClickListener,它将执行您的事件处理代码,然后调用旧的onClickListener。将复合单击侦听器设置为视图。


1
2018-01-08 21:16



我还有一个想法。您可以使用自定义视图(MyCustomView)作为TabWidget子项。然后,您可以使MyCustomView的setOnclickListener方法以非标准方式工作:不要删除旧的单击侦听器,而是将所有单击侦听器“汇总”为一个复合侦听器。因此,当您的视图被点击时,它将调用已设置的所有点击侦听器而不是最后一个。 - Leonidos