我正在尝试创建一个viewpager,它可以用不同的工具栏浏览3个不同的片段。我之前在一个活动中实现了新工具栏,并使其正常工作,但我正在尝试使其与片段一起工作
这是碎片代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout resource that'll be returned
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar_home);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
mToolbar.setTitle(null);
return rootView;
}
我正在用片段扩展我的片段,但是我得到了错误
Cannot resolve method setSupportActionBar
我不知道如何解决这个问题,如果我删除setSupportActionBar
代码,它会停止与某些设备一起工作吗?
基于@Faisal Naseer答案。下面是使用自定义工具栏(带有导航和菜单)的完整示例(只需几点注释
fragment\u主页。xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"">
...
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_home"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="Home" />
</androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment。千吨级
class HomeFragment : BaseFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
// setHasOptionsMenu(true): don't need this anymore
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
toolbar_home.setNavigationOnClickListener {
// do something when click navigation
}
toolbar_home.inflateMenu(R.menu.menu_home)
toolbar_home.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_add -> {
// do something
true
}
R.id.action_update -> {
// do something
true
}
else -> {
super.onOptionsItemSelected(it)
}
}
}
}
}
menu\u主页。xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_add"
android:title="@string/add_device"
app:showAsAction="never" />
<item
android:id="@+id/action_update_room"
android:title="@string/update_room"
app:showAsAction="never" />
</menu>
希望能有所帮助
我已经看到很多答案提到了在片段中为工具栏设置支持操作栏,但如果在活动中有工具栏,在片段中有单独的工具栏,这种方法可能会出错。
当您将“活动”工具栏中的“设置支持操作栏”(setSupportActionBar)切换到“片段”(Fragment)工具栏时,您可能会面临菜单项(MenuItem)的重复,即使您尝试使用“设置选项”(SetHasOptions)菜单(true)进行覆盖
- 其次,如果您想更新活动的工具栏,您会看到您的更改没有反映出来,因为片段中有设置支持操作栏
因此,为了避免这种情况,我建议使用工具栏方法,如下面的内部片段来膨胀菜单并使用
toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
toolbar.inflateMenu(R.menu.frag_menu_items);
Menu menu = toolbar.getMenu();
并使用
工具栏。OnMenuItemClickListener
界面接收menuItems单击事件。
编辑(部分复制自Mr Engineering 13答案)
如果你担心后退按钮,你可以这样设置
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
片段没有这样的方法setSupportActionBar()
。ActionBar是Activity的一个属性,因此要将工具栏设置为ActionBar,您的活动应该从ActionBarActivity扩展,然后您可以调用片段:
((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);
更新
如果您使用的是AppCompatActivity:
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
问题内容: 我正在尝试创建一个viewpager,它可以通过3个不同的片段滑动,每个片段具有不同的工具栏。我之前已经在一个活动中实现了新工具栏,并且可以使用它,但是我正在尝试使其与片段一起使用 这是片段代码 我使用扩展了片段,但是却出现了错误 我不确定如何解决此问题,如果删除代码,它将停止在某些设备上运行吗? 问题答案: 片段没有这种方法。ActionBar是Activity的属性,因此要将工具栏
问题内容: 在我的应用程序中,我有两个片段和一个MainActivity。activity_main.xml包含一个折叠式工具栏,当片段为空时,该工具栏非常适合我。在我的第一个片段中,我从服务器获取json数据,并将其放入片段活动内的listview中。数据已正确获取并显示,但是listview占据了整个屏幕,而我折叠的工具栏似乎有点小虫子,就像有时它弹出并消失了,并且listview不再可滚动了
问题内容: 我有一个这样布置的应用程序,mainactivity包含2个带有相应片段的选项卡,第一个片段具有可正常使用的回收站视图,我试图在人向上或向下滚动时添加视差效果,不是确保我是否应该将其添加到片段的xml或mainactivity的xml中,我将其添加到mainactivity的xml并将片段包含为我的recyclerview,不用说视差不起作用,现在应用程序无法打开,我立即获取NullP
问题内容: 我想将工具栏设置为操作栏,但是由于您的工具栏是布局元素,因此必须位于您的布局中。现在我的布局在我的片段中。 我在布局中添加了工具栏,并在片段中对其进行了调用: 之所以有效,是因为我可以设置标题等等,但是现在我希望它作为操作栏做出反应,因为我实际上想拥有它。setDisplayHomeAsUpEnabled(true) 为此,我必须将工具栏更改为操作栏: 这在我的片段中不起作用… 谁能帮
我有4个片段,其中一个片段中有一个viewpager和一个不同的类,我用3个其他片段定义了viewpager的适配器,第一次打开此片段时,所有子片段都正确显示在viewpager中,但当我切换(使用transaction.replace)到另一个片段并再次返回时,子片段消失了,我不能使用ChildFragmentManager,因为它在代码中显示错误(ChildFragmentManager无法解
问题内容: 您如何在不进行更改的情况下,高效,优雅地从Python中提取项目3..6 : 在片符号似乎并没有与工作… 问题答案: import itertools output = list(itertools.islice(q, 3, 7)) 例如: 与到目前为止发布的其他解决方案相比,这应该更有效。证明?