Android L中不支持操作栏导航模式

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

文档解释说:

操作栏导航模式已弃用,内联不支持 工具栏操作栏。考虑使用其他常见的导航模式 相反。< / p >

替换的是什么?

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

117381 次浏览

新的Android设计支持库添加了TabLayout,提供了一个与标签材料设计指南匹配的选项卡实现。如何实现Tabs和ViewPager的完整攻略可以在这个视频中找到

现在弃用: PagerTabStrip是支持库的一部分(已经有一段时间了),可以直接替代。如果您更喜欢较新的谷歌播放样式选项卡,您可以使用PagerSlidingTabStrip图书馆或修改谷歌提供的示例SlidingTabsBasicSlidingTabsColors,如此Dev Bytes视频所述。

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

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

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

工具栏是用于内部的操作栏的泛化 应用程序的布局。而操作栏传统上是操作栏的一部分 活动的不透明窗口装饰控制的框架,一个工具栏 可以放置在视图内嵌套的任意级别 层次< / em > . < / p >

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

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

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

此外,它可以通过appcompat库用于以前的Android版本。更多信息请参见本文由Chris Banes撰写。摘录:

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

新的Toolbar不能用于扩展多个行对象,因此不可能向其添加制表符 如果你想像TabWidget一样使用Toolbar,你可以向它插入一些制表符对象,但只能使用旧的Holo样式

在这里有一个自定义库,它使用v7 Toolbar,就像使用新的材质设计动画的TabWidget一样,但它使用与旧的ActionBar Tabs相同的方法,所以你可以将你的ViewPager附加到它

对于已弃用的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);

希望这对你有帮助。

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

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

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

我发现这些教程在一起的操作栏(现在的“工具栏”- argh),支持滑动标签与材料设计很有帮助:

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

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

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

对于我来说,使用工具栏v7小部件appcompat来处理已弃用的导航工具栏。

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

我认为当你有三到五个同样重要的屏幕时,一个合适的替代品是BottomNavigationActivity,这可以用来切换片段。

你会注意到Android Studio中存在一个向导,但要注意,因为Android Studio倾向于生成过于复杂的样板代码。

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

另一个质量教程可以在Android Hive这里找到: https://www.androidhive.info/2017/12/android-working-with-bottom-navigation/ < / p >