从片段内部访问 Toolbar/ActionBar 对象

Posted

技术标签:

【中文标题】从片段内部访问 Toolbar/ActionBar 对象【英文标题】:Accessing Toolbar/ActionBar object from inside fragment 【发布时间】:2016-06-17 16:37:13 【问题描述】:

在开发应用程序并学习了大量有关 Java 和 android 的成功之后,我遇到了一个问题。我一直在谷歌搜索(工具栏、应用栏、片段、空指针异常、操作栏、appcompatactivity、v7、v4 支持库、主题=noactionbar 等)。

我也读过this page。

如果我只是使用普通的活动,我不会有问题,但我很困惑,我想知道是否有人可以提供帮助。

最初,我在 Android Studio 1.5.1 中使用样板 Navigation Drawer Activity 启动了一个项目。该应用程序的主要目的是显示人员列表。这是通过 listFragment 完成的(因为应用程序执行的其他操作(片段)可以从导航抽屉中选择)。

当我决定将 3 个非常相似的列表片段合并为一个时,我的问题就开始了。当从 Navigation Drawer 中选择此 listFragment 并加载到主视图中时,我将改为使用单个 listFragment 并用 Spinner 替换我的 Navigation Drawer(主)Activity 的 App Bar/Toolbar/Action Bar 上的标题。

微调器的目的是作为过滤列表视图(listFragment)元素的一种方式。该列表是人员列表,Spinner 选项类似于“排序方式:”[最近联系、收藏、最近](这些是最初的三个单独的 listFragments)。

所以...我能找到的最接近解决方案的是:

How to combine Navigation Drawer and Spinner [like in Google+ App]

所以我尝试让这个解决方案适应我的问题......唯一的区别是我使用的是 Fragments 并尝试从我的 Fragment 内部访问 getActionBar() (?)。

从片段内部,我输入:

ActionBar actionBar = getActivity()).getActionBar();

我收到一条警告,它可能会返回 null,但确实如此。

我也试过了:

ActionBar actionBar = getActivity()).getSupportActionBar();

结果相同。

然后我了解到(并在主要活动中阅读)Toolbar 是 ActionBar 的新版本......我可以在主要活动的样板代码中看到以下内容:

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

所以“啊哈!!”我将代码更改为:

Toolbar toolbar = getActivity()).getT.......

但是没有提供这样的 getToolbar() 方法......显然我不知道我在做什么。

记住:

我的 Main Activity 扩展了 AppCompatActivity(我认为这是 Navigation Drawer 工作所必需的) 我的主要活动的主题是“AppTheme.NoActionBar”(这是在开头的默认代码中提供的,但对我来说没有意义,因为屏幕顶部显然有一个栏,它是导航抽屉)

我的主要活动导入以下内容: 导入android.app.Fragment; 导入android.app.FragmentManager; 导入android.app.FragmentTransaction; 导入android.os.Bundle; 导入 android.support.design.widget.FloatingActionButton; 导入 android.support.design.widget.Snackbar; 导入android.util.Log; 导入android.view.View; 导入 android.support.design.widget.NavigationView; 导入 android.support.v4.view.GravityCompat; 导入 android.support.v4.widget.DrawerLayout; 导入 android.support.v7.app.ActionBarDrawerToggle; 导入android.support.v7.app.AppCompatActivity; 导入android.support.v7.widget.Toolbar; 导入 android.view.Menu; 导入android.view.MenuItem; 导入 com.android.volley.RequestQueue;

build.gradle 包含: 依赖 编译 fileTree(dir: 'libs', include: ['*.jar']) 测试编译'junit:junit:4.12' 编译'com.android.support:appcompat-v7:23.1.1' 编译'com.android.support:design:23.1.1' 编译'com.android.volley:volley:1.0.0' 编译'org.immutables:gson:2.1.8'

我的基本问题是:

1) 我需要从片段中访问哪类对象(应用栏、操作栏、工具栏、??)?

2) 如何从片段内部访问该对象?

感谢您的耐心等待!

更新:

自从发布此消息后,我了解到:

Toolbar 和 ActionBar 不是一回事。我正在使用使用“材料设计”的导航抽屉。我的 Main Activity 扩展了 AppCompatActivity 并使用 Toolbar,而不是 ActionBar。

从我的片段中,我可以使用以下方法访问工具栏对象:

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

但是,我找不到任何教程来解释如何将微调器从片段添加到工具栏。他们只解释了如何使用 Actionbar 来做到这一点。 (参见我之前提到的this link)

更新!!!

似乎无法通过仅访问工具栏对象从片段内部创建/控制主活动工具栏中的微调器,因此 Naresh 和 Sahil 的以下解决方案是正确的......我必须使用 getSupportActionBar() 并使用 (AppCompatActivity) 或 ([TheActualNameOfMyMainActivity]) 进行转换,如下所示:

ActionBar actionbar = ((AppCompatActivity)getActivity()).getSupportActionBar();

【问题讨论】:

你能简单介绍一下吗? ***.com/questions/17954471/… 你的片段是否附加到活动中? 分享你的 github 仓库 @BooberBunz 添加 ActionBar 而不是工具栏,因为您将拥有更多控制权,并且 getSupportActionBar 将返回 ActionBar 并且主题不是 ActionBar 然后它不会有 ActionBar 但我认为因为您添加了您所看到的ActionBar 参考这里可能你会得到一些帮助:- coderzpassion.com/android-working-with-material-design 【参考方案1】:

如果您使用的是 AppCompatActivity,请这样做。

ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();

或者,如果您使用的是 ActionBarActivity,那么试试这个。

ActionBar actionBar = ((ActionBarActivity )getActivity()).getSupportActionBar();

【讨论】:

以上是关于从片段内部访问 Toolbar/ActionBar 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问活动内部/从活动中的片段视图组件

从片段中禁用导航抽屉

从适配器访问片段

基于内部片段的graphql过滤器(gatsbyJS)

如何以编程方式从片段内部设置ViewPager选项卡?

底部导航 如何从片段内部更改片段