使用带有片段的工具栏

Al *_*sey 34 java android android-fragments android-viewpager android-toolbar

我正在尝试创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

我正在扩展我的片段Fragment,但是我得到了错误

Cannot resolve method setSupportActionBar
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个问题,如果我删除setSupportActionBar代码将停止使用某些设备吗?谢谢

vin*_*ius 63

碎片没有这种方法setSupportActionBar().ActionBar是Activity的一个属性,因此要将工具栏设置为actionBar,您的活动应该从ActionBarActivity扩展,然后您可以调用Fragment:

 ((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果您正在使用AppCompatActivity:

 ((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
Run Code Online (Sandbox Code Playgroud)

  • @vinitius嘿,在你上面的回答中你忘了在getActivity之后写"()".所以请添加这个,以便其他人不会混淆. (2认同)

Fai*_*eer 31

我已经看到很多答案提到setSupportActionBar了工具栏内部,Fragment但如果你有Activity一个工具栏和一个单独的Toolbarin,这种方法可能会出错Fragment.

  1. 当您setSupportActionBar从Activity的工具栏切换到Fragment的工具栏时,MenuItem即使您尝试覆盖使用,也可能面临重复setHasOptionsMenu(true).
  2. 其次,如果您想要更新活动工具栏,您会看到您的更改未因setSupportActionBar片段内部而反映出来.

所以为了避免这种情况,我建议在片段内使用像这样的工具栏方法来扩充菜单和使用

 toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
    toolbar.inflateMenu(R.menu.frag_menu_items);
    Menu menu = toolbar.getMenu();
Run Code Online (Sandbox Code Playgroud)

并使用Toolbar.OnMenuItemClickListenermenuItems点击事件接收接口.

编辑(从MrEngineer13复制的部分回答)

如果您担心后退按钮,可以像这样设置它

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
   }
});
Run Code Online (Sandbox Code Playgroud)


mur*_*thi 9

使用新的AppCompatActivity,您应该调用它而不是ActionBarActivity:

((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)


Pha*_*inh 6

基于@Faisal Naseer答案。下面是完整的例子(有几个注意事项)使用自定义的Toolbar 具有导航菜单Fragment

fragment_home.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>
Run Code Online (Sandbox Code Playgroud)

HomeFragment.kt

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)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

menu_home.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>
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助

在此处输入图片说明