在开发应用程序并学习大量关于Java和Android的成功之后,我遇到了一个问题。我一直在谷歌搜索(工具栏,应用程序栏,片段,空指针异常,动作栏,appcompatactivity,v7,v4支持库,theme = noactionbar等等。)
我还阅读了this page。
如果我只是使用正常的活动,我就不会有问题,但我会感到非常困惑,并且我想知道是否有人可以提供帮助。
最初,我在Android Studio 1.5.1中启动了一个带有样板导航抽屉活动的项目。该应用程序的主要目的是显示人员列表。这是通过listFragment完成的(因为应用程序可以从导航抽屉中选择其他内容(片段))。
当我决定将3个非常相似的listfragments合并为一个时,我的问题开始了。当我从导航抽屉中选择此listFragment时,我会通过使用单个listFragment并使用Spinner替换导航抽屉(主)活动的应用栏/工具栏/操作栏上的标题来执行此操作。加载到主视图中。
微调器的目的是过滤listview(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();
具有相同的结果。
然后我学习(并在主要活动中阅读)工具栏是ActionBar的新版本......我可以在主要活动的样板代码中看到以下内容:
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
所以" Ahaa !!"我将代码更改为:
Toolbar toolbar = getActivity()).getT.......
但是没有提供这样的getToolbar()方法......显然我不知道我在做什么。
请记住:
我的主要活动导入以下内容: import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.View; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import com.android.volley.RequestQueue;
build.gradle包含: 依赖{ 编译fileTree(dir:' libs',include:[' * .jar']) testCompile' junit:junit:4.12' 编译' com.android.support:appcompat-v7:23.1.1' 编译' com.android.support:设计:23.1.1' 编译' com.android.volley:volley:1.0.0' 编译' org.immutables:gson:2.1.8' }
我的基本问题是:
1)我需要从片段中访问哪类对象(App栏,操作栏,工具栏,?)?
2)如何从片段内部访问该对象?
感谢您的耐心等待!
自发布以来,我了解到:
工具栏和ActionBar不是一回事。我正在使用一个使用"材料设计的导航抽屉。"我的主要活动扩展了AppCompatActivity并使用工具栏,而不是ActionBar。
从我的片段中,我可以使用:
访问工具栏对象Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
但是,我找不到任何解释如何从片段向TOOLBAR添加微调器的教程。他们只解释如何使用Actionbar来做到这一点。 (参见前面提到的this link)
通过访问仅工具栏对象,从片段内部创建/控制主活动工具栏中的微调器似乎不太可能,因此下面是Naresh和Sahil的解决方案是正确的...我必须使用getSupportActionBar()并使用(AppCompatActivity)或([TheActualNameOfMyMainActivity])将其强制转换为:
ActionBar actionbar = ((AppCompatActivity)getActivity()).getSupportActionBar();
答案 0 :(得分:3)
如果您正在使用AppCompatActivity,请执行此操作。
ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
或者,如果您正在使用ActionBarActivity,请尝试此操作。
ActionBar actionBar = ((ActionBarActivity )getActivity()).getSupportActionBar();