如何从片段中获取工具栏?

ani*_*art 102 android android-fragments android-actionbar android-support-library android-toolbar

ActionBarActivityNavigationDrawer和使用support_v7 Toolbar的动作条.在我的一个片段工具栏中有自定义视图.在其他片段中Toolbar应显示标题.

如何Toolbar从片段中获取自定义实例?我可以使用ActionBar getActivity().getActionBar(),但是如果我调用setTitle()这个实例ActionBar它什么都不做.

UPD:

就我而言

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(正如MrEngineer13所说)在第一次片段创建时不起作用,因为我从onHiddenChanged()调用它.现在我向onCreateView()添加更多一个,它工作正常.

MrE*_*r13 190

您需要将您的活动从第一个投射getActivity()AppCompatActivity第一个.这是一个例子:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
Run Code Online (Sandbox Code Playgroud)

你必须抛出它的原因是因为getActivity()返回a FragmentActivity而你需要一个AppCompatActivity

  • 得到'supportActionBar'和'工具栏'是一回事吗? (7认同)

Fli*_*bor 76

如果片段应具有ToolBar的自定义视图,则可以分别为每个片段实现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"/>
Run Code Online (Sandbox Code Playgroud)

在片段中找到它:

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

菜单监听器可以通过两种方式创建:覆盖片段中的onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

或者在onCreateView()中创建工具栏时设置监听器:

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 请更新.现在你需要转换为`AppCompatActivity`. (2认同)

Bha*_*nki 40

您可以通过两种方式获取片段中的工具栏

第一

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
Run Code Online (Sandbox Code Playgroud)

第二个

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是一个活动到多个片段模型,第一个示例只是为您提供对主工具栏的引用,以便您可以从片段中对其进行操作。我相信,这也是最好的选择。 (2认同)

Dan*_*ial 8

toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)