ActionBarSherlock选项卡在加载自己的选项卡之前,最初显示另一个选项卡的内容

时间:2013-05-27 10:04:38

标签: android android-listview android-actionbar actionbarsherlock

我在使用制表符和ActionBarSherlock方面遇到了一些麻烦。

基本上,我有一个菜单,其中有3个按钮可以加载一个Activity。此活动是一个SherlockListActivity,有3个选项卡将根据菜单中用于启动活动的项目进行选择。

我遇到的问题是,当我通过菜单加载第一个标签时,返回菜单,从菜单中加载第三个标签,它会显示第一个标签为选中 - 然后加载第三个标签。

以下是我实施的一些细节:

活动是:

public class MyActivity extends SherlockListActivity implements ActionBar.TabListener

在onCreate中调用以下命令来设置名为mode的全局String:

    String dToken = null;

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        dToken = extras.getString("value");
    }
    mode = dToken;

在onCreate中使用以下内容初始化ABS和标签:

    ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);

    //Sets the ActionBarSherlock Tabs
    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab leftTab = getSupportActionBar().newTab();
    leftTab.setText("First");
    leftTab.setTabListener(this);

    ActionBar.Tab midTab = getSupportActionBar().newTab();
    midTab.setText("Second");
    midTab.setTabListener(this);

    ActionBar.Tab rightTab = getSupportActionBar().newTab();
    rightTab.setText("Third");
    rightTab.setTabListener(this);

现在设置选择哪个选项卡(使用从上面的第二个代码块获得的模式变量),这是onCreate的结尾:

    if (mode.equals("first"))
        ab.addTab(leftTab, true);
    else ab.addTab(leftTab, false);             
    if (mode.equals("second"))
        ab.addTab(midTab, true);
    else ab.addTab(midTab, false); 
    if (mode.equals("third"))
        ab.addTab(rightTab, true);
    else ab.addTab(rightTab, false);

所以让我们说在菜单中,我点击第一个菜单项。它会加载第一个标签的结果。我返回菜单并单击第三个菜单项,它将加载第一个选项卡的结果几秒钟,然后切换到第三个选项卡的结果。

当每个菜单项加载单独的活动时,这不是问题,但我将它们全部合并,因为三个活动之间的代码几乎相同。

我尝试使用后退按钮时调用this.finish,以便我可以清除活动,但这不起作用。

1 个答案:

答案 0 :(得分:0)

看看我的标签监听器,

private class MyTabListener implements ActionBar.TabListener {
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {

        switch (tab.getPosition()) {
        case 0:

            if (frag1 == null) {
                // If not, instantiate and add it to the activity
                frag1 = Fragment.instantiate(getApplicationContext(),
                        PackagesFragment.class.getName());
                ft.add(android.R.id.content, frag1, "Feeds");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag1);
            }
            return;

        case 1:

            if (frag2 == null) {
                // If not, instantiate and add it to the activity
                frag2 = Fragment.instantiate(getApplicationContext(),
                        BlogsFragment.class.getName());
                ft.add(android.R.id.content, frag2, "Profile");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag2);
            }
            return;
        case 2:

            if (frag3 == null) {
                // If not, instantiate and add it to the activity
                frag3 = Fragment.instantiate(getApplicationContext(),
                        GalleryFragment.class.getName());
                ft.add(android.R.id.content, frag3, "Gallery");
            } else {
                // If it exists, simply attach it in order to show it
                ft.show(frag3);
            }
            return;

        }

    }

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

            // Detach the fragment, because another one is being attached
            switch (tab.getPosition()) {
            case 0:
                ft.hide(frag1);
                return;
            case 1:
                ft.hide(frag2);
                return;
            case 2:
                ft.hide(frag3);
                return;


            }


    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }
}