如何从片段获取工具栏?


107

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

如何Toolbar从片段中获取用于定制的实例?我可以使用获取ActionBar getActivity().getActionBar(),但是如果我调用setTitle()该实例ActionBar,它什么也不做。

UPD:

就我而言

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

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


片段没有actionbars / toolbars活动
tyczj 2014年

(MainAcivity)this.getActivity())。getToolbar(); 将是正确的答案!分段获取工具栏!!
LOG_TAG 2015年

Answers:


201

您需要从投你的活动getActivity(),以AppCompatActivity第一。这是一个例子:

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

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

在科特林:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

8
得到'supportActionBar'和'toolbar'是同一回事吗?
达尔潘'16

@Darpan不确定
Konstantin Konopko

如果我添加它,它会更改标题。。但是,如果我返回到父活动,如何再次更改标题?我的意思是我有一个导航抽屉。侧抽屉有一些碎片,主要活动有自己的标题。当我设置主要活动的标题时,它的工作原理是零碎的,您提到的方法很完美。但是,我应该如何更改活动名称?
凯洛·伦(Kylo Ren)

82

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

1
我只想确认这是正确的方法?如果我们在viewpager + Tablayout或Pagertabstripe中使用工具栏加载不同的片段,则在滑动时会影响应用程序性能吗?
LOG_TAG

1
@LOG_TAG我有一个抽屉设计,每个片段都实现了工具栏(因此在布局文件中有一个工具栏),上面的代码对我来说非常有用。
MattBoothDev 2015年

谢谢!像HEYUL一样工作!!:)顺便说一句,最好重写父Activity onOptionsItemSelected()而不是Fragment,以避免代码重复。
Aditya Naique 2015年

@ChadMx不,为什么他甚至写过有关在xml中添加工具栏的文章,等等。作者问如何从片段中以编程方式获取工具栏。所以stackoverflow.com/a/26998718/4548520这是最好/正确的答案,而且简短
user25

43

您有两种选择来获取分段的工具栏

第一

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

第二个

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

但这是正确的方法吗.. bcoz我们也有getSupportedActionBar吗?
Code_Life

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

2

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


!!是完全可以避免的,?它将节省您可能的崩溃
JonZarate

我相信这样会更好(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

也许您必须尝试getActivity().getSupportActionBar().setTitle()使用support_v7。


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

3
您的活动中必须有一个名为getToolbar()的方法,这很糟糕,因为这不是活动和片段之间的通信方式。
Marko 2015年

2
是的,没有其他办法了!许多导航抽屉库仅实现此样式!有时由于AppCompatActivity(AppCompatActivity)getActivity()这是另一个痛苦点,我们需要强制转换活动!所有这些东西完全杀死了开发人员时间:(
LOG_TAG

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>

Kotlin:在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)
        }
    }

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

0

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

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中工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.