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

时间:2014-11-18 15:55:22

标签: android android-fragments android-actionbar android-support-library android-toolbar

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

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

UPD:

就我而言

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

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

11 个答案:

答案 0 :(得分:175)

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

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

您必须投放它的原因是因为getActivity()返回FragmentActivity而您需要AppCompatActivity

答案 1 :(得分:73)

如果片段应具有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"/>

在片段中找到它:

@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;
            }
        });

答案 2 :(得分:39)

您可以通过两种方式获取片段

中的工具栏

第一个

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

和第二个

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

答案 3 :(得分:8)

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

答案 4 :(得分:1)

如果您使用support_v7,可能需要尝试getActivity().getSupportActionBar().setTitle()

答案 5 :(得分: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();

当您在工具栏中使用微调器并从片段中调用工具栏中的微调器或自定义视图时,这非常有用!

来自您的活动:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

答案 6 :(得分:1)

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

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

你可以像这样使用:

setToolbarTitle("Hello World");

答案 7 :(得分:1)

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

答案 8 :(得分:1)

以XML

 <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>

科特琳:在fragment.kt中 -> onCreateView()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }

答案 9 :(得分: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;
    }
    

答案 10 :(得分:0)

如果您正在使用自定义工具栏或ActionBar ,并且想从Fragments获取工具栏/操作栏的引用,则需要首先从Fragment的 onCreateView < / strong>如下所示的方法。

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

就是这样。它将在Fragment中工作。