创建动作条选项卡还调用其selectTab功能 [英] Creating ActionBar tab also calling its selectTab functions

查看:169
本文介绍了创建动作条选项卡还调用其selectTab功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在创建应用程序栏选项卡,并附加 tabListener 给他们,并在父类中的函数 createTabs tabListener的 onTabSelected 它检查所选选项卡,并通过调用的意图其活性。

现在在所有的活动课,我称之为的onCreate 法此功能,以实例上的活动标签。
现在问题是 createTabs 当我加入标签在这样的语句:

  actionBar.addTab(actionBar.newTab()的setText(事件频道)
                .setIcon(R.drawable.ic_action_alarms)
                .setTabListener(tabListener),0,FALSE);

它会自动调用 onTabSelected 监听方法,当传输控制活动类的,我是反对调用这个函数的onCreate 方法,实例化的标签,这将在一个无限循环我的申请。


  1. 我的问题是,为什么 onTabSelected 后获取调用 .addTab

  2. 什么是解决走出这个无限循环?

请帮忙:

createTabs方法父活动类:
    公共无效createTabs(ActionBar的动作条){

  {尝试
        //最后的动作条动作条= getActionBar();
        actionBar.setDisplayShowTitleEnabled(假);
        actionBar.setDisplayUseLogoEnabled(真);        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        ActionBar.TabListener tabListener =新ActionBar.TabListener(){            @覆盖
            公共无效onTabUnselected(标签为arg0,ARG1 FragmentTransaction){
                // TODO自动生成方法存根            }            @覆盖
            公共无效onTabSelected(标签选项卡,FragmentTransaction ARG1){
                INT tabPosition = tab.getPosition();
                开关(tabPosition){
                情况下0:
                    意图startFeedActivity =新意图(
                            MainActivity.this,EventFeed.class);
                    startActivity(startFeedActivity);
                    打破;
                情况1: {
                    意图startWideActivity =新意图(MainActivity.this,
                            WideView.class);
                    startActivity(startWideActivity);
                    打破;
                }
                案例2:
                    的setContentView(R.layout.event_feed);
                    打破;
                }            }            @覆盖
            公共无效onTabReselected(标签为arg0,ARG1 FragmentTransaction){
                // TODO自动生成方法存根            }
        };        actionBar.addTab(actionBar.newTab()的setText(事件频道)
                .setIcon(R.drawable.ic_action_alarms)
                .setTabListener(tabListener),0,FALSE);
        actionBar.addTab(actionBar.newTab()的setText(广)
                .setIcon(R.drawable.ic_action_Wide)
                .setTabListener(tabListener),1,真);
        actionBar.addTab(actionBar.newTab()的setText(报告)
                .setIcon(R.drawable.ic_action_location_found)
                .setTabListener(tabListener),2,FALSE);
    }赶上(例外五){
        Log.getStackTraceString(e.getCause()的getCause());
        的setContentView(R.layout.activity_main);
        Toast.makeText(这一点,哎呀蝙蝠侠!,Toast.LENGTH_SHORT).show();    }}

在活动类:

 公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.event_feed);
    createTabs(getActionBar());
    loadFeed();
}

在调试器的地方可以看出, ActionBarImpl.selectTab ActionBarImpl.addTab

  MainActivity $ 1.onTabSelected(动作条$标签,FragmentTransaction)行:44
ActionBarImpl.selectTab(动作条$选项卡)线:572
ActionBarImpl.addTab(动作条$标签,整型,布尔)线:511
WideView(MainActivity)。 createTabs(动作条)行:74
WideView.onCreate(捆绑)行:20
WideView(活动).performCreate(包)行:5133


解决方案

<击>
你需要做的是设置监听器的之后的添加标签:

  ActionBar.Tab wideTab = actionBar.newTab()的setText(广)
            .setIcon(R.drawable.ic_action_Wide);
actionBar.addTab(wideTab,1,TRUE);
wideTab.setTabListener(tabListener);

您是对的;不工作。如果你在整个复制此活动code(你不应该 - 它应该在基地的活动,然后你对他人应该扩展的),刚刚摆脱困境的合适的情况下,你的听众 onTabSelected 方法。

作为一个方面说明,我会建议考虑使用片段了解您的标签内容,而不是活动。

 类MyTabListener实现ActionBar.TabListener {
    私人诠释mTabPosition;    公共MyTabListener(INT tabPosition){
        mTabPosition = tabPosition;
    }    @覆盖
    公共无效onTabUnselected(标签为arg0,ARG1 FragmentTransaction){
        // TODO自动生成方法存根    }    @覆盖
    公共无效onTabSelected(标签选项卡,FragmentTransaction ARG1){
        INT tabPosition = tab.getPosition();
        //如果我们试图选择这种已经选定的选项卡,摆脱困境。
        如果(tabPosition == mTab​​Position)回报;
        开关(tabPosition){
        情况下0:
            意图startFeedActivity =新意图(
                    MainActivity.this,EventFeed.class);
            startActivity(startFeedActivity);
            打破;
        情况1: {
            意图startWideActivity =新意图(MainActivity.this,
                    WideView.class);
            startActivity(startWideActivity);
            打破;
        }
        案例2:
            的setContentView(R.layout.event_feed);
            打破;
        }    }    @覆盖
    公共无效onTabReselected(标签为arg0,ARG1 FragmentTransaction){
        // TODO自动生成方法存根    }
}

,然后添加一个标签时:

  actionBar.addTab(actionBar.newTab()的setText(事件频道)
            .setIcon(R.drawable.ic_action_alarms)
            .setTabListener(新MyTabListener(0)),0,假);

I have a function createTabs in a parent class that create application bar tabs and attach tabListener to them and in tabListener's onTabSelected it checked for the selected tab and call its activity through intent.

Now in all the activity classes I call this function in onCreate method, to instantiate tabs on that activity. Now issues is in createTabs when I am adding tabs in statements like:

actionBar.addTab(actionBar.newTab().setText("Event Feed")
                .setIcon(R.drawable.ic_action_alarms)
                .setTabListener(tabListener),0,false);

It automatically calls onTabSelected listener method, when transfer the control to the activity class where I am against calling this function in onCreate method, to instantiate tabs, this sends my application in an infinite loop.

  1. My Question is why onTabSelected is getting called after .addTab?
  2. And what is the solution to come out of this infinite loop?

Please help:

createTabs method in parent activity class: public void createTabs(ActionBar actionBar) {

    try {
        // final ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(true);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.TabListener tabListener = new ActionBar.TabListener() {

            @Override
            public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onTabSelected(Tab tab, FragmentTransaction arg1) {
                int tabPosition = tab.getPosition();
                switch (tabPosition) {
                case 0:
                    Intent startFeedActivity = new Intent(
                            MainActivity.this, EventFeed.class);
                    startActivity(startFeedActivity);
                    break;
                case 1: {
                    Intent startWideActivity = new Intent(MainActivity.this,
                            WideView.class);
                    startActivity(startWideActivity);
                    break;
                }
                case 2:
                    setContentView(R.layout.event_feed);
                    break;
                }

            }

            @Override
            public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
                // TODO Auto-generated method stub

            }
        };

        actionBar.addTab(actionBar.newTab().setText("Event Feed")
                .setIcon(R.drawable.ic_action_alarms)
                .setTabListener(tabListener),0,false);
        actionBar.addTab(actionBar.newTab().setText("Wide")
                .setIcon(R.drawable.ic_action_Wide)
                .setTabListener(tabListener),1,true);
        actionBar.addTab(actionBar.newTab().setText("Report")
                .setIcon(R.drawable.ic_action_location_found)
                .setTabListener(tabListener),2,false);
    } catch (Exception e) {
        Log.getStackTraceString(e.getCause().getCause());
        setContentView(R.layout.activity_main);
        Toast.makeText(this, "Oops Batman!", Toast.LENGTH_SHORT).show();

    }

}

in Activity class:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.event_feed);
    createTabs(getActionBar());
    loadFeed();
}

In debugger where it can be seen that ActionBarImpl.selectTab is getting called after ActionBarImpl.addTab

MainActivity$1.onTabSelected(ActionBar$Tab, FragmentTransaction) line: 44   
ActionBarImpl.selectTab(ActionBar$Tab) line: 572    
ActionBarImpl.addTab(ActionBar$Tab, int, boolean) line: 511 
WideView(MainActivity). createTabs (ActionBar) line: 74 
WideView.onCreate(Bundle) line: 20  
WideView(Activity).performCreate(Bundle) line: 5133 

解决方案

What you need to do is set the listener after adding the tab:

ActionBar.Tab wideTab = actionBar.newTab().setText("Wide")
            .setIcon(R.drawable.ic_action_Wide);
actionBar.addTab(wideTab,1,true);
wideTab.setTabListener(tabListener);

You're right; that doesn't work. If you're duplicating this code across Activities (you shouldn't - it should go in a 'base' Activity and then your others should extend that), just bail out for the appropriate case out of your listeners onTabSelected method.

As a side note, I'd recommend looking into using Fragments for your tab content, rather than Activities.

class MyTabListener implements ActionBar.TabListener {
    private int mTabPosition;

    public MyTabListener(int tabPosition) {
        mTabPosition = tabPosition;
    }

    @Override
    public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction arg1) {
        int tabPosition = tab.getPosition();
        // If we're trying to select this already-selected tab, bail out.
        if (tabPosition == mTabPosition) return;
        switch (tabPosition) {
        case 0:
            Intent startFeedActivity = new Intent(
                    MainActivity.this, EventFeed.class);
            startActivity(startFeedActivity);
            break;
        case 1: {
            Intent startWideActivity = new Intent(MainActivity.this,
                    WideView.class);
            startActivity(startWideActivity);
            break;
        }
        case 2:
            setContentView(R.layout.event_feed);
            break;
        }

    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }
}

And then when adding a tab:

actionBar.addTab(actionBar.newTab().setText("Event Feed")
            .setIcon(R.drawable.ic_action_alarms)
            .setTabListener(new MyTabListener(0)),0,false);

这篇关于创建动作条选项卡还调用其selectTab功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆