访问工具栏(及其子)从片段?

我正在使用v7.widget.Toolbar组件构建一个应用程序。

我可以将工具栏添加到我的活动中,但我不知道如何(以及正确的方法是什么)从活动的片段中访问它。

这是工具栏

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" app:theme="@style/MainActionBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" tools:context=".MainActivity"> <ImageView android:background="@drawable/icon_1" android:paddingLeft="1dp" android:paddingRight="1dp" android:layout_marginLeft="19dp" android:id="@+id/menu_1" android:layout_gravity="center_vertical|left" android:src="@drawable/menu_burger" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_marginRight="19dp" android:paddingLeft="1dp" android:paddingRight="1dp" android:id="@+id/menu_2" android:layout_gravity="center_vertical|right" android:src="@drawable/icon_2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

以下是我在活动中使用它的方式:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/view_home_toolbar" /> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> ... ... </LinearLayout> 

在我的活动onCreate:

  Toolbar actionBar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(actionBar); 

现在,例如,我想从我的片段中的工具栏访问“@ id / menu_1”,我该怎么做?

getSupportActionBar()给我的ActionBar,但我需要工具栏

提前致谢!

我不确定这是否可行,但可以尝试。

  final AppCompatActivity act = (AppCompatActivity) getActivity(); if (act.getSupportActionBar() != null) { Toolbar toolbar = (Toolbar) act.getSupportActionBar().getCustomView(); } 

工具栏本质上是一个ViewGroup。

这将为你做这项工作

 ((MainAcivity)this.getActivity()).getToolbar(); 

Activity和Fragments之间的通信(对于任何Java组件都是一样的)应该通过一个接口完成。

为你的情况定义一个接口

 public interface IOperateOnToolbar { //methods allowing to communicate with toolbar public void setToolbarColor(Color c); public void setImageView1Resource(int resID); public void setImageView2Resource(int resID); //..... } 

所以你有一个活动

  public class MainActivity extends AppCompatActivity implements IOperateOnToolbar { //onCreate, onDestroy ... public void setToolbarColor(Color c) { //implementation follows } public void setImageView1Resource(int resID) { imageView1.setBackgroundResource(resID); } public void setImageView2Resource(int resID) { imageView2.setBackgroundResource(resID); } } 

和你的片段

 public class MyFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { IOperateOnToolbar toolbarCallback = (IOperateOnToolbar) getActivity(); } } 

使用接口进行组件之间的通信具有以下好处:

  • 如果将“MainActivity”替换为另一个(“ActivityX”,它也实现IOperateOnToolbar),则不必在“MyFragment”中编辑任何内容

  • “MyFragment”只能访问由IOperateOnToolbar接口公开的方法。

请使用这个接口来查看这个文档 ,google在这里建议通信(片段之间,但是原则上应该是相同的)。

在这里你可以访问工具栏的孩子

 TextView toolbarTextView = (TextView) ((MainActivity) this.getActivity()).findViewById(R.id.toolbarTitle); toolbarTextView.setText("Hello"); 

不需要编码很多:按照这个

在Kotlin:

  var toolbar = activity.findViewById<Toolbar>(R.id.toolbar) toolbar.setTitle("Rashid") 

在Java中:

  Toolbar toolbar = getActivity().findViewById(R.id.toolbar); toolbar.setTitle("Rashid")