Android 如何从片段中获取工具栏?
我有Android 如何从片段中获取工具栏?,android,android-fragments,android-actionbar,android-support-library,android-toolbar,Android,Android Fragments,Android Actionbar,Android Support Library,Android Toolbar,我有ActionBarActivity和NavigationDrawer并使用support_v7工具栏作为操作栏。在我的一个片段中,工具栏具有自定义视图。在其他片段中,工具栏应显示标题 如何从片段中获取自定义的工具栏实例?我可以使用getActivity().getActionBar()获取ActionBar,但是如果我为这个实例调用setTitle()ActionBar,它将什么也不做 UPD: 就我而言 ((ActionBarActivity)getActivity()).getSuppo
ActionBarActivity
和NavigationDrawer
并使用support_v7工具栏作为操作栏。在我的一个片段中,工具栏具有自定义视图。在其他片段中,工具栏
应显示标题
如何从片段中获取自定义的工具栏
实例?我可以使用getActivity().getActionBar()
获取ActionBar,但是如果我为这个实例调用setTitle()
ActionBar,它将什么也不做
UPD:
就我而言
((ActionBarActivity)getActivity()).getSupportActionBar().setTitle()代码>
(正如MrEngineer13所说)在第一次创建片段时不工作,因为我从onHiddenChanged()调用它。现在,我在onCreateView()中添加了多个选项,效果很好。如果您使用的是support v7,那么您可能必须尝试getActivity().getSupportActionBar().setTitle()
。您需要首先将活动从getActivity()
转换为AppCompativity
。下面是一个例子:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
您必须强制转换它的原因是getActivity()
返回一个FragmentActivity
,并且您需要一个AppCompatActivity
在科特林:
(activity as AppCompatActivity).supportActionBar?.title = "My Title"
在片段应该有自定义工具栏视图的情况下,您可以分别为每个片段实现工具栏
将工具栏添加到fragment_布局中:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"/>
可以通过两种方式创建菜单侦听器:
覆盖片段中选定的OnOptions项:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
//set toolbar appearance
toolbar.setBackground(R.color.material_blue_grey_800);
//for crate home button
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}
或在onCreateView()中创建工具栏时为其设置侦听器:
从片段:(从片段中获取工具栏?)
当您使用工具栏中的微调器并从片段中调用工具栏中的微调器或自定义视图时,这非常有用
从您的活动中:
// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
您有两个选择来获取片段中的工具栏
第一个
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
第二个呢
Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
对于Kotlin用户(活动作为AppCompatActivity).supportActionBar?.show()
我使用以下步骤完成了此操作
在主片段的onCreateView
中使用下面的代码设置标题
为了在片段之间交换,我使用了底部导航栏,它在片段的MainActivity
(父活动)上实现。即使您正在使用任何按钮或菜单项,也可以从SelectedItemClickListener上的更改标题,就像我在本例中所做的那样。
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.menu_dashboard:
getSupportActionBar().setTitle("Dashboard");
fm.beginTransaction().hide(active).show(dashboardFragment).commit();
active = dashboardFragment;
return true;
case R.id.menu_workshop:
getSupportActionBar().setTitle("Workshops");
fm.beginTransaction().hide(active).show(workshopFragment).commit();
active = workshopFragment;
return true;
}
return false;
}
在XML中
->onOptionsItemSelected()
如果您正在使用自定义工具栏或操作栏并且希望从片段中获取工具栏/操作栏的引用,那么您需要首先从片段的onCreateView方法中获取主要活动的实例,如下所示
MainActivity activity = (MainActivity) getActivity();
然后使用活动进一步实现,如下所示
ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);
在调用此功能之前,您需要在MainActivity中初始化自定义工具栏,如下所示
第一组定义你的公共工具栏
public Toolbar toolbar;
public ActionBar actionBar;
并在onCreate()方法中指定自定义工具栏id
toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
就这样。它将在片段中工作。片段没有操作栏/工具栏活动(MainActivity)this.getActivity()).getToolbar();将是正确的答案!!用于在片段中获取工具栏!!我只是想确认这是正确的方法吗?如果我们在viewpager+Tablayout或PagerTabstrime中使用工具栏加载不同的片段,那么在滑动?@LOG_标记时会影响应用程序的性能。我有一个抽屉设计,每个片段都实现了工具栏(因此在布局文件中有一个工具栏),上面的代码对我来说非常有用。谢谢!像HEYUL一样工作!!:)顺便说一句,最好覆盖父活动的onOptionsItemSelected()
,而不是片段,以避免代码重复。@ChadMx不,他为什么要写关于用xml添加工具栏的文章等等。作者询问如何从片段中以编程方式获取工具栏。因此,这是最好/正确的答案,而且很短,在活动中必须有一个名为getToolbar()的方法,这是不好的,因为这不是活动和片段之间通信的方式。是的,没有其他方法!!许多导航抽屉库只实现这种风格!!!有时我们需要强制转换活动,因为AppCompatActivity(AppCompatActivity)getActivity()是另一个痛点!!!所有这些东西完全消耗了开发人员的时间:(获取“supportActionBar”和“toolbar”是一回事?@Darpan不确定我是否添加了它,它会更改标题..但是如果我返回到父活动,如何再次更改标题?我的意思是我有一个导航抽屉。侧抽屉有一些片段,主活动有自己的标题。当我设置主活动的标题时,它会工作,并且以片段的方式你提到的工作非常完美。但是我应该如何在返回时更改活动的标题?但这是正确的方法吗..bcoz我们也有getSupportedActionBar?如果你使用的是一个“一个活动到多个片段”的模型,第一个示例只会给你一个主工具栏的引用,这样你就可以从你的片段中操作它。它也是,i b请相信,这是最好的选择。!!
完全可以通过?
避免,并且它将为您节省大量的时间。我相信这会更好(活动作为?AppCompatiActivity)?.supportActionBar?.show()
<androidx.appcompat.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways">
</androidx.appcompat.widget.Toolbar>
setHasOptionsMenu(true)
val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)
(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)
(activity as? AppCompatActivity)?.supportActionBar?.show()
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.app_main_menu,menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.selected_id->{//to_do}
else -> super.onOptionsItemSelected(item)
}
}
MainActivity activity = (MainActivity) getActivity();
ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);
public Toolbar toolbar;
public ActionBar actionBar;
toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();