【问题标题】:Action bar navigation modes are deprecated in Android L操作栏导航模式在 Android L 中已弃用
【发布时间】:2014-06-29 04:39:51
【问题描述】:

查看Android“L”预览的API diff报告,我看到ActionBar类中所有与导航模式相关的方法(例如setNavigationMode()addTab()selectTab()等) )。现已弃用。

文档说明:

操作栏导航模式已被弃用且内联不支持 工具栏操作栏。考虑使用其他常见的导航模式 而是。

假定的替换是什么?

另外,“内联工具栏操作栏”是一个新概念吗?我想我以前没有听说过。

【问题讨论】:

标签: android android-actionbar android-navigation android-5.0-lollipop


【解决方案1】:

新的Android Design Support Library 增加了TabLayout,提供了与material design guidelines for tabs 匹配的选项卡实现。关于如何实现 Tabs 和 ViewPager 的完整演练可以在 this video 中找到

现已弃用:PagerTabStrip 是支持库的一部分(并且已经存在了一段时间),可以直接替代。如果您更喜欢较新的 Google Play 样式标签,您可以使用 PagerSlidingTabStrip library 或修改 Google 提供的示例 SlidingTabsBasicSlidingTabsColors,如 Dev Bytes video 中所述。

【讨论】:

  • 这是纵向模式下的直接替换,其好处是可以轻松使用扩展的 Material-type 标题。但是,在横向模式下,ActionBar 选项卡会自动向上移动到操作栏本身,从而释放重要的屏幕区域。有人知道用支持库管理这个的干净方法吗?
  • 开发者文档仍然说使用操作栏选项卡。 Simlpy 还没更新?developer.android.com/training/implementing-navigation/…
  • 这是 NAVIGATION_MODE_TABS 的替代品,但不是 NAVIGATION_MODE_LIST 的替代品:/
  • @Geobert - NAVIGATION_MODE_LIST 要容易得多,因为所做的只是添加一个 Spinner 和一些回调助手。
  • NAVIGATION_MODE_LIST 的替代品是什么?我的将其列为已弃用...
【解决方案2】:

现在可以使用 Android 5.0 文档,我们有 official documentation for the Toolbar widget

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

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

Toolbar 小部件也可用于替换操作栏:

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

操作栏中选项卡的弃用很可能是由于这个原因,因为工具栏本身不能包含选项卡。

此外,它还可以通过 appcompat 库用于以前的 Android 版本。有关更多信息,请参阅this post by Chris Banes。摘录:

Android 5.0 引入了一个新的工具栏小部件。这是一个概括 ActionBar 模式,但给你更多更多的控制和 使用它的灵活性。工具栏是层次结构中的一个视图,就像 任何其他的,使它更容易与你的其他观点交错, 动画,对滚动事件做出反应。

【讨论】:

  • “更多的控制和灵活性”只有在有合理且易于使用的默认值时才是好的。如果某些东西很灵活,但你需要在这里和那里使用 20 行代码才能让它工作,我不认为这是一个胜利......
  • @TWiStErRob 我同意。强调他的,不是我的:)
  • @TWiStErRob 我也有同感……谷歌最好小心,这种活动让我想起了老微软
【解决方案3】:

似乎他们添加了一个名为android.widget.Toolbar 的新类,它扩展了ViewGroup。他们还在Activity 中添加了一个新方法setActionBar(Toolbar)。我还没有测试过,但看起来你可以将各种TabWidgetsSpinners 或自定义视图包装到Toolbar 中并将其用作您的操作栏。

【讨论】:

【解决方案4】:

新的Toolbar不能用于膨胀多个线对象,所以不能给它添加Tabs。
如果您想使用 ToolbarTabWidget 一样,您可以向其中插入一些选项卡对象,但只能使用旧的 Holo 样式。

Here 有一个自定义库,它使用 v7 ToolbarTabWidget 和新的 Material Design 动画,但它使用与旧 ActionBar Tabs 相同的方法,所以你可以将你的 ViewPager 附加到它。

【讨论】:

    【解决方案5】:

    为了“替换”已弃用的 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);
    

    希望这有帮助。

    【讨论】:

      【解决方案6】:

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

      在包含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;
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        【解决方案8】:

        我发现这些教程在将支持滑动选项卡的操作栏(现在是“工具栏” - 啊)与 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 这不是我的错,因为该域似乎已过期。 youtube 视频仍然很重要
        • @kip2 我同意,这不是你的错。但是,我建议大家不要因为这个问题而使用链接来解释答案。
        【解决方案9】:

        我可以使用工具栏 v7 小部件 appcompat 来处理已弃用的导航工具栏。

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

        【讨论】:

          【解决方案10】:

          我认为当你有三到五个同等重要的屏幕时,一个合适的替代品是底部导航活动,它可以用来切换片段。

          您会注意到 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/

          【讨论】:

            猜你喜欢
            • 2014-09-29
            • 1970-01-01
            • 1970-01-01
            • 2015-01-17
            • 1970-01-01
            • 2016-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多