ich versuche, einen Viewpager zu erstellen, der durch drei verschiedene Fragmente mit jeweils einer anderen Symbolleiste streicht. Ich habe die neue Symbolleiste bereits in einer Aktivität implementiert und sie zum Laufen gebracht. Ich versuche jedoch, sie mit Fragmenten zu arbeiten
Hier ist der Fragmentcode
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout resource that'll be returned
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar_home);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
mToolbar.setTitle(null);
return rootView;
}
Ich erweitere mein Fragment mit Fragment
, erhalte jedoch den Fehler
Cannot resolve method setSupportActionBar
Ich bin nicht sicher, wie ich das beheben kann. Wenn ich den setSupportActionBar
-Code entferne, funktioniert er mit bestimmten Geräten nicht mehr? Danke
Fragmente Keine solche Methode setSupportActionBar()
. ActionBar ist eine Eigenschaft von Activity. Um Ihre Symbolleiste als ActionBar festzulegen, sollte Ihre Aktivität von ActionBarActivity ausgehen. Anschließend können Sie Ihr Fragment aufrufen:
((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);
UPDATE
Wenn Sie AppCompatActivity verwenden, :
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
Ich habe eine Menge Antworten gesehen, die setSupportActionBar
für die Symbolleiste in Fragment
erwähnen, aber dieser Ansatz kann schief gehen, wenn Sie eine Symbolleiste in Activity
und eine separate Toolbar
in Fragment
haben.
setSupportActionBar
von der Symbolleiste von Activity in die Symbolleiste von Fragment verschieben, kann es vorkommen, dass MenuItem
doppelt vorhanden ist, selbst wenn Sie versuchen, mit setHasOptionsMenu(true)
zu überschreiben.setSupportActionBar
in Ihrem Fragment widergespiegelt.Um dies zu vermeiden, empfehle ich die Verwendung von Werkzeugleistenmethoden wie dieser innerhalb von fragment, um das Menü aufzublasen und zu verwenden
toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
toolbar.inflateMenu(R.menu.frag_menu_items);
Menu menu = toolbar.getMenu();
und verwenden Sie Toolbar.OnMenuItemClickListener
-Schnittstelle, um mit menuItems Klickereignisse zu empfangen.
Bearbeiten (Abschnitt kopiert aus MrEngineer13 Antwort )
wenn Sie sich Sorgen um den Zurück-Button machen, können Sie ihn so einstellen
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
Mit der neuen AppCompatActivity sollten Sie sie anstelle von ActionBarActivity aufrufen:
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
Sie können mit dieser Funktion eine Symbolleiste in Fragmenten hinzufügen
((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);
Basis ist @Faisal Naseer Antwort. Hier ist das vollständige Beispiel (mit wenigen Notizen) für die Verwendung von benutzerdefiniertem Toolbar
Mit Navigation und Menü in Fragment
fragment_home.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"">
...
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar_home"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:title="Home" />
</androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment.kt
class HomeFragment : BaseFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
// setHasOptionsMenu(true): don't need this anymore
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
toolbar_home.setNavigationOnClickListener {
// do something when click navigation
}
toolbar_home.inflateMenu(R.menu.menu_home)
toolbar_home.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_add -> {
// do something
true
}
R.id.action_update -> {
// do something
true
}
else -> {
super.onOptionsItemSelected(it)
}
}
}
}
}
menu_home.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_add"
Android:title="@string/add_device"
app:showAsAction="never" />
<item
Android:id="@+id/action_update_room"
Android:title="@string/update_room"
app:showAsAction="never" />
</menu>
Ich hoffe es hilft