如何从片段获取工具栏?

问题描述 投票:98回答:9

我具有ActionBarActivityNavigationDrawer,并使用support_v7 Toolbar作为ActionBar。在我的片段之一中,工具栏具有自定义视图。在其他片段中,Toolbar应显示标题。

如何从片段中获取Toolbar实例以进行自定义?我可以用getActivity().getActionBar()来获得ActionBar,但是如果我为此实例ActionBar调用setTitle(),它什么也不做。

UPD:

就我而言

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

(正如MrEngineer13所说的)在第一次创建片段时不起作用,因为我从onHiddenChanged()调用它。现在,我向onCreateView()添加了一个,效果很好。

android android-fragments android-actionbar android-support-library android-toolbar
9个回答
183
投票

您需要先将活动从getActivity()投射到AppCompatActivity。这是一个例子:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

您必须进行强制转换的原因是因为getActivity()返回了FragmentActivity,并且您需要AppCompatActivity


75
投票

如果片段应具有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;
            }
        });

40
投票

您有两种选择来分割工具栏

第一个

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

和第二个

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

8
投票
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

1
投票

[如果使用support_v7,也许必须尝试getActivity().getSupportActionBar().setTitle()


1
投票

来自片段:(从片段获取工具栏?)

// 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();

1
投票

您可以在Activity类上为此创建一个方法:

public void setToolbarTitle(String title) {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle(title);
}

您可以这样使用:

setToolbarTitle("Hello World");

1
投票

对于Kotlin用户(activity as AppCompatActivity).supportActionBar?.show()


0
投票

我通过执行此步骤来完成。

  1. 使用下面的代码在主片段的onCreateView中设置标题。
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");

  1. 为了在片段之间交换,我正在使用底部导航栏,该导航栏是在片段的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;
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.