问题
I'm building an application using the v7.widget.Toolbar component.
I'm able to add the toolbar to my activity, but I don't know how (and what is the right way?) to access it from the activity's fragment.
Here's the 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" />
Here's how I use it in the activity:
<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>
In my activity's onCreate:
Toolbar actionBar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(actionBar);
And now, for example, I want to access "@id/menu_1" from the Toolbar in my fragment, How do I do that?
getSupportActionBar() gives me the ActionBar, but I need the Toolbar
Thanks in advance!
回答1:
I'm not sure if this works, but you can try it.
final AppCompatActivity act = (AppCompatActivity) getActivity();
if (act.getSupportActionBar() != null) {
Toolbar toolbar = (Toolbar) act.getSupportActionBar().getCustomView();
}
Toolbar is essentially a ViewGroup.
回答2:
no need to code a lot: follow this
in Kotlin:
var toolbar = activity.findViewById<Toolbar>(R.id.toolbar)
toolbar.setTitle("Rashid")
in Java:
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Rashid")
回答3:
The communication between Activity and Fragments (the same holds for any Java components) should be done through an Interface.
For your case define an interface
public interface IOperateOnToolbar {
//methods allowing to communicate with toolbar
public void setToolbarColor(Color c);
public void setImageView1Resource(int resID);
public void setImageView2Resource(int resID);
//.....
}
So you have an Activity
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);
}
}
And your Fragment
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
IOperateOnToolbar toolbarCallback = (IOperateOnToolbar) getActivity();
}
}
Using the interfaces for communication between components has the following benefits:
If you replace the "MainActivity" with another one ("ActivityX" which also implements IOperateOnToolbar), you don't have to edit anything in "MyFragment"
"MyFragment" has access only to those methods, which are exposed by IOperateOnToolbar interface.
Please chceck this docu, where google advises the communication (between fragments, but should be the in principle the same) using interfaces.
回答4:
this will do the job for you
((MainAcivity)this.getActivity()).getToolbar();
回答5:
Here you can access toolbar children:
TextView toolbarTextView = (TextView) ((MainActivity) this.getActivity()).findViewById(R.id.toolbarTitle);
toolbarTextView.setText("Hello");
回答6:
In my case I has an activity and a navigation drawer that replaces this activity fragment with other fragments. If you implement toolbar views (spinners, Buttons..) in the main activity, the fragments that will be replaced in this activity can see toolbar and interact with its views.
else if, you need to handle actions depending on this views, you can use: getActivity.findViewById(); inside fragment.
来源:https://stackoverflow.com/questions/28327745/access-toolbar-and-its-children-from-fragment