【问题标题】:Creating ActionBar tab also calling its selectTab functions创建 ActionBar 选项卡也调用它的 selectTab 函数
【发布时间】:2013-09-30 10:05:00
【问题描述】:

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

现在在所有活动类中,我在onCreate 方法中调用此函数,以实例化该活动上的选项卡。 现在问题出在createTabs,当我在如下语句中添加标签时:

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

它自动调用onTabSelected监听器方法,当将控件转移到我反对在onCreate方法中调用此函数的活动类时,实例化选项卡,这会使我的应用程序陷入无限循环。

  1. 我的问题是为什么 onTabSelected 在 .addTab 之后被调用?
  2. 那么解决这个无限循环的方法是什么?

请帮忙:

父活动类中的createTabs方法: 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();

    }

}

在 Activity 类中:

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

在调试器中可以看到ActionBarImpl.selectTab 在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 

【问题讨论】:

    标签: java android


    【解决方案1】:

    您需要做的是在添加选项卡之后设置监听器:

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

    你是对的;那是行不通的。如果您在活动中复制此代码(您不应该 - 它应该进入“基础”活动,然后您的其他人应该扩展它),只需从您的听众onTabSelected 方法中退出适当的情况。

    作为旁注,我建议您考虑使用Fragments 作为您的标签内容,而不是活动。

    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
    
        }
    }
    

    然后在添加选项卡时:

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

    【讨论】:

    • 尝试你的方式会抛出错误:java.lang.IllegalStateException: Action Bar Tab must have a Callback
    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多