我具有ActionBarActivity
和NavigationDrawer
,并使用support_v7 Toolbar
作为ActionBar。在我的片段之一中,工具栏具有自定义视图。在其他片段中,Toolbar
应显示标题。
如何从片段中获取Toolbar
实例以进行自定义?我可以用getActivity().getActionBar()
来获得ActionBar,但是如果我为此实例ActionBar调用setTitle()
,它什么也不做。
UPD:
就我而言
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();
(正如MrEngineer13所说的)在第一次创建片段时不起作用,因为我从onHiddenChanged()调用它。现在,我向onCreateView()添加了一个,效果很好。
您需要先将活动从getActivity()
投射到AppCompatActivity
。这是一个例子:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
您必须进行强制转换的原因是因为getActivity()
返回了FragmentActivity
,并且您需要AppCompatActivity
如果片段应具有ToolBar的自定义视图,则可以为每个片段分别实现ToolBar。
将工具栏添加到fragment_layout:
<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"/>
在片段中查找:
@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);
}
菜单侦听器可以通过两种方式创建:覆盖片段中的onOptionsItemSelected:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}
或在onCreateView()中创建工具栏时设置工具栏的侦听器:
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
});
您有两种选择来分割工具栏
第一个
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
和第二个
Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
[如果使用support_v7,也许必须尝试getActivity().getSupportActionBar().setTitle()
。
来自片段:(从片段获取工具栏?)
// get toolbar
((MainAcivity)this.getActivity()).getToolbar(); // getToolbar will be method in Activity that returns Toolbar!! don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();
这在您在工具栏中使用微调器并从片段中调用spinner或在工具栏中调用自定义views时非常有用!
来自您的活动:
// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
您可以在Activity类上为此创建一个方法:
public void setToolbarTitle(String title) {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(title);
}
您可以这样使用:
setToolbarTitle("Hello World");
对于Kotlin用户(activity as AppCompatActivity).supportActionBar?.show()
我通过执行此步骤来完成。
onCreateView
中设置标题。((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
MainActivity
(父活动)上实现的。即使您正在使用任何按钮或菜单项,也可以从onSelectedItemClickListener
更改标题,就像我的情况一样。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;
}