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

时间:2015-02-04 17:34:45

标签: android android-toolbar

我正在使用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>

在我的活动中创建:

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

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

getSupportActionBar()为我提供了ActionBar,但我需要工具栏

提前致谢!

6 个答案:

答案 0 :(得分:9)

我不确定这是否有效,但你可以尝试一下。

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

工具栏本质上是一个ViewGroup。

答案 1 :(得分:6)

无需编写很多代码:按照

进行操作

在Kotlin:

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

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

答案 2 :(得分:3)

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

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

  • 如果您更换&#34; MainActivity&#34;与另一个(&#34; ActivityX&#34;也实现IOperateOnToolbar),你不必编辑&#34; MyFragment&#34;

  • &#34; MyFragment&#34;只能访问IOperateOnToolbar接口公开的那些方法。

请chceck this docu,谷歌建议使用接口进行通信(片段之间,但原则上应该是相同的)。

答案 3 :(得分:2)

这将为你完成工作

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

答案 4 :(得分:2)

您可以在此处访问工具栏子项:

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

答案 5 :(得分:0)

在我的情况下,我有一个活动和一个导航抽屉,用其他片段替换此活动片段。 如果在主活动中实现工具栏视图(微调器,按钮..), 将在此活动中替换的片段可以查看工具栏并与其视图进行交互。

否则,如果需要根据此视图处理操作,可以使用:getActivity.findViewById();里面片段。