【问题标题】:android 3.0+ action bar tabsandroid 3.0+ 操作栏标签
【发布时间】:2012-05-07 05:15:01
【问题描述】:

我没有使用过android 3.0+,也没有使用action bar,所以我对可以在action bar 中实现的选项卡有疑问。它是否仅限于更改片段?标签可以是:第一个活动,第二个片段吗?从我检查的示例中,有一个具有操作栏的主要活动,并且每个选项卡的内容是一个单独的片段。如果我的问题很明显,对不起。提前谢谢你。

【问题讨论】:

    标签: android tabs android-actionbar


    【解决方案1】:

    我没有看到您使用 Activity 作为第一个使用 Fragments 的优势?片段非常强大,可以提供与 Activity 一样多的功能。

    话虽如此,您应该能够在选择 Tab 时获得回调,因此在该回调中您所要做的就是加载一个 Activity。确保在加载新 Activity 时传入当前选择的选项卡,以便用户可以看到选择了哪个选项卡。

    使用 Fragment 的原因是您不必加载新的 Activity,并且可以用新的 Content 替换当前的 Fragment。

    【讨论】:

    • 问题是我想在第一个 Activity 中有两个片段,即第一个选项卡。因此,如果我在第一个选项卡中使用一个片段,该片段是否可以包含另外两个片段?我有点困惑,希望我没有让你也困惑。
    • 你不能在另一个 Fragment 中嵌入一个 Fragment。
    • 所以我应该将它们嵌入到活动中,并且该活动可以是操作栏的选项卡,对吗? :S
    • 你实现了一个监听器,当一个选项卡被选中时提供一个回调。然后,您可以根据需要更换片段。我还没有尝试过,但您可以将内容视图换出,并使用新布局重新创建。只要确保您没有保留对现在无效的视图的旧引用。
    • 好的,我会尝试实现它。感谢您的回复。
    【解决方案2】:

    没有任何内容说您必须切换片段,即使基本代码的结构使其易于操作。

    例如,我只是使用选项卡来更改一次加载的视图布局层次结构中元素的可见性,并且效果很好。如果您的视图层次结构不那么复杂,这似乎更有效,因为它消除了片段事务。据推测,更改视图的可见性非常有效。

    这是一个不完整的代码片段,让您了解如何忽略片段事务并做自己的事情:

        public class AudioManagerTabListener<T extends Fragment> implements
            ActionBar.TabListener {
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            switch ((Integer) tab.getTag()) {
            case TAG_SHARED:
                mGridViewWrapper.setVisibility(View.VISIBLE);
                break;
            case TAG_PLAYING:
                mNowPlayingWrapper.setVisibility(View.VISIBLE);
                break;
            case TAG_PLAYLIST:
                break;
            case TAG_ARTISTS:
                break;
            case TAG_ALBUMS:
                break;
            case TAG_SONGS:
                break;
            }
            if (DBG.AUDIO) {
                Log.d(TAG,
                        "SettingsTabListener- onTabSelected - Tag: "
                                + tab.getText());
            }
    
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            switch ((Integer) tab.getTag()) {
            case TAG_SHARED:
                mGridViewWrapper.setVisibility(View.GONE);
                break;
            case TAG_PLAYING:
                mNowPlayingWrapper.setVisibility(View.GONE);
                break;
            case TAG_PLAYLIST:
                break;
            case TAG_ARTISTS:
                break;
            case TAG_ALBUMS:
                break;
            case TAG_SONGS:
                break;
            }
            if (DBG.AUDIO) {
                Log.d(TAG,
                        "SettingsTabListener- onTabUnSelected - Tag: "
                                + tab.getText());
            }
    
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            if (DBG.AUDIO) {
                Log.d(TAG, "SettingsTabListener- onTabReselected- Position: "
                        + tab.getPosition());
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我会记住这一点,也许是另一种情况。现在,我的布局很复杂,我通过为每个选项卡设置一个单独的片段来解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多