Android L中不建议使用操作栏导航模式


203

纵观在为Android“L”预览API diff报告,我看到与在导航模式的所有方法ActionBar类(如setNavigationMode()addTab()selectTab(),&C)。现在已弃用。

该文档说明:

内置工具栏操作栏不赞成使用操作栏导航模式。考虑改用其他常见的导航模式。

所谓的替代品是什么?

另外,“嵌入式工具栏操作栏”是否是新概念?我想我以前没有听说过。


您在哪里找到了L Preview的文档?
Kuno 2014年

8
@KlassenK它尚未集成到主要文档中,但您可以从developer.android.com/preview/reference.html
matiash 2014年

感谢您指向文档的链接!
罗伯特·卡尔

对于setNavigationList,您使用了什么
Lion789

1
@ShirishHerwade是的,因为它在发布Android 5.0时已合并到主要文档中。无论如何,您现在都可以在developer.android.com/reference/android/app/…中
matiash

Answers:


179

新的Android设计支持库添加了TabLayout,提供了与标签的材料设计准则相匹配的标签实现。如何实现标签和一个完整的演练ViewPager中可以找到这个视频

现在弃用:PagerTabStrip是支持库的一部分(已经有一段时间),并作为直接替换。如果您喜欢较新的Google Play样式标签,则可以使用PagerSlidingTabStrip库或修改Google提供的示例SlidingTabsBasicSlidingTabsColors,如本开发字节视频中所述


8
这是在纵向模式下的直接替代,它具有易于使用扩展的Material-type标头的优点。但是,在横向模式下,“动作栏”选项卡会自动向上移动到动作栏本身,从而释放重要的屏幕区域。有人知道使用支持库来管理此问题的干净方法吗?
ehartwell 2014年

9
开发人员文档仍显示使用操作栏选项卡。Simlpy还没有更新吗?developer.android.com/training/implementing-navigation/...
罗穆卢斯Urakagi蔡

3
这是NAVIGATION_MODE_TABS的替代品,但不是NAVIGATION_MODE_LIST的替代品:/
Geob-o-matic 2014年

2
@Geobert- NAVIGATION_MODE_LIST容易得多,因为所做的全部就是添加一个Spinner和一些回调助手。
ianhanniballake 2014年

2
替代NAVIGATION_MODE_LIST什么?矿山将其列为已弃用……
索伦2014年

20

现在可以使用Android 5.0文档,我们已经有了Toolbar小部件官方文档

在应用程序内容中使用的标准工具栏。

工具栏是在应用程序布局中使用的操作栏的概括。传统上,操作栏是由框架控制的Activity不透明窗口装饰的一部分,而工具栏则可以放置在视图层次结构中的任意嵌套级别

一个Toolbar小工具也可以用来代替行动吧:

应用程序可以选择使用该setActionBar()方法将工具栏指定为活动的操作栏。

由于工具栏不能包含标签本身,因此最可能是由于操作栏中标签的弃用。

此外,它还可以通过appcompat库在以前的Android版本中使用。有关更多信息,请参见Chris Banes的这篇文章。摘录:

Android 5.0引入了新的工具栏小部件。这是动作条模式的推广,但给你很多在使用它更多的控制和灵活性。工具栏与其他任何视图一样,都是层次结构中的视图,可以更轻松地与其余视图进行交织,制作动画,对滚动事件做出反应。


53
只有在有合理且易于使用的默认设置的情况下,“更多的控制和灵活性”才是不错的选择。如果某些东西很灵活,但是您需要在这里和那里20条线才能使它正常工作,那么我不认为这是一场胜利……
TWiStErRob 2014年

1
@TWiStErRob我同意。强调他而不是我的:)
matiash 2014年

6
@TWiStErRob我的感觉也一样……Google最好提防,这种活动让我想起了旧的Microsoft
Sauron 2014年

13

似乎他们添加了一个名为android.widget.Toolbarextends 的新类ViewGroup。此外,他们增加了一个新的方法setActionBar(Toolbar)Activity。我没有测试过,但它看起来像你可以用各种各样的TabWidgetsSpinners或者自定义视图进入Toolbar并使用它作为你的动作条。


1
如果某人尝试使用“工具栏”小部件尝试了任何事情,或者知道它打算如何工作,可以与他人分享。兼容性包中还包括它吗?
桑德拉(Sandra)2014年


1
非常感谢您提供的链接。因此,如果现在我想开发一个符合新材料指南的应用程序,则可能应该等待工具栏可用,因为如果使用操作栏,我将使用所有内容那是不推荐的。
桑德拉(Sandra)2014年

1
ActionBar仍将是标准设计模式。仅不建议使用导航模式(制表符或微调器)。请参阅developer.android.com/guide/topics/ui/actionbar.html#Tabsdeveloper.android.com/guide/topics/ui/actionbar.html#Dropdown
Kuno 2014年

1
我认为这与问题有关。新的i / o 2014应用程序的apk可以下载,并且您可以从plus.google.com/+RomanNurik/posts/PD6MS3feXTT中看到,使用了很多工具栏样式。我们只需要等待源代码,然后进行探索即可:(
Sandra

4

新的Toolbar不能用于使多个线对象膨胀,因此无法向其中添加制表符。
如果你想使用一个ToolbarTabWidget你可以插入一些标签的对象,但只能用旧的霍洛风格。

这里有一个自定义库,它与新的Material Design动画Toolbar一样使用v7 TabWidget,但是它使用了与旧相同的方法ActionBar Tabs,因此您可以将ViewPager其附加到它。


3

对于已过时的ActionBar的“替换”,我将ActionBar类型的变量的类型更改为PagerTabStrip,如下所示(注释中的旧代码):

// ActionBar bigActionBar;
PagerTabStrip bigActionBar;

〜actionBar的.selectTab(tabindex)的“替换”是使用我关联的ViewPager的.setCurrentItem(int)方法,如下所示(注释中的旧代码):

/*
ActionBar.Tab eventTab = bigActionBar.getTabAt(2);
bigActionBar.selectTab(eventTab);
*/
mViewPager.setCurrentItem(2);

希望这会有所帮助。


1

我遇到了同样的问题,此解决方案非常适合我:

在包含viewpager的布局xml文件中,添加一个PagerTabStrip,如下所示:

<android.support.v4.view.PagerTabStrip
    android:id="@+id/pager_tab_strip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:background="#996633"
    android:textColor="#CCCCCC"
    android:paddingTop="5dp"
    android:paddingBottom="5dp" />

要控制页面标题,请在您的ViewPager文件中添加一个switch语句:

@Override
public CharSequence getPageTitle(int position)
{
    switch (position)
    {
    case 0:
        return "Page 1";

    case 1:
        return "Page 2";

    case 2:
        return "Page 3";

    }

    return null;
}

0

FragmentTabHost也是一个选项。

此代码来自Android开发者网站:

/**
 * This demonstrates how you can implement switching between the tabs of a
 * TabHost through fragments, using FragmentTabHost.
 */
public class FragmentTabs extends FragmentActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.fragment_tabs);
    mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
            FragmentStackSupport.CountingFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
            LoaderCursorSupport.CursorLoaderListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
            LoaderCustomSupport.AppListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
            LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
    }
}

1
这是一个包含此答案的教程,因此可能会对某人有所
Dejan

0

我发现这些教程在将动作栏(现在称为“工具栏”-argh)组合在一起时非常有用,该动作栏通过Material Design支持滑动选项卡:

https://www.youtube.com/watch?v=Fl0xMuo10yA

http://www.exoguru.com/android/material-design/navigation/android-sliding-tabs-with-material-design.html

您必须综合这些资源来匹配您的特定情况。例如,您可能不希望以与exoguru.com教程相同的样式手动创建选项卡。


第二个链接已死。
jcaruso

@jcaruso这不是我的错,因为该域似乎已过期。尽管youtube视频仍然有意义
kip2 2016年

1
@ kip2我同意,这不是你的错。但是,我建议,正如每个人的建议一样,由于这个问题,请避免使用链接来解释答案。
jcaruso

0

好吧,我可以使用工具栏v7小部件appcompat处理不推荐使用的导航工具栏。

    setSupportActionBar(toolbar);
    getSupportActionBar().setSubtitle("Feed Detail");
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //goToWhere
        }
    });

0

我认为当您拥有三到五个同等重要性的屏幕时,BottomNavigationActivity是一个合适的替代方法,可以用来切换片段。

您会注意到Android Studio中存在用于此操作的向导,但是请注意,因为Android Studio倾向于生成过于复杂的样板代码。

可以在这里找到教程:https : //android.jlelse.eu/ultimate-guide-to-bottom-navigation-on-android-75e4efb8105f

可以在此处的Android Hive中找到另一个质量教程:https : //www.androidhive.info/2017/12/android-working-with-bottom-navigation/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.