Ich versuche, einen Viewpager zu erstellen, der durch 3 verschiedene Fragmente mit jeweils einer anderen Symbolleiste wischt. Ich habe die neue Symbolleiste zuvor in einer Aktivität implementiert und zum Laufen gebracht, aber ich versuche, sie mit Fragmenten zum Laufen zu bringen
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 Fragmentjedoch bekomme ich den Fehler
Cannot resolve method setSupportActionBar
Ich bin mir nicht sicher, wie ich das lösen soll, wenn ich die entferne setSupportActionBar Code wird es mit bestimmten Geräten nicht mehr funktionieren?
Gibt es ein Problem damit, es in Ihrem Aktivitätslayout zu haben und es in Ihrer Aktivität festzulegen?
– Tachyonenfluss
12. März 2015 um 21:53 Uhr
Jede Symbolleiste für jeden Viewpager hat eine andere Farbe und andere Menüs, also dachte ich, es wäre besser, sie mit den Fragmenten zu steuern
– Al Hennessey
12. März 2015 um 21:59 Uhr
Moment mal, das ist nicht der springende Punkt in diesem Szenario nicht die einzustellen ToolBar wie ActionBar? Da Sie beabsichtigen, dass jedes Fragment sein eigenes hat ToolBar (der zusammen mit dem anderen Inhalt des Fragments wischt), wir sprechen über die ‘eigenständige’ (scrollen Sie nach unten zum Abschnitt „eigenständig“) Verwendung des Widgets.
– MH.
12. März 2015 um 22:06 Uhr
Der Menüteil wird bereits mit verschiedenen Menü-XMLs und Anhängen über unterstützt onCreateOptionsMenu. Der Farbteil kann innerhalb der durchgeführt werden onAttach Verwenden Sie so etwas wie stackoverflow.com/questions/25081706/…
– Tachyonenfluss
12. März 2015 um 22:13 Uhr
Vinitus
Fragmente habe keine solche Methode setSupportActionBar(). ActionBar ist eine Eigenschaft von Activity. Um also Ihre Symbolleiste als actionBar festzulegen, sollte sich Ihre Aktivität von ActionBarActivity aus erstrecken, und dann können Sie Ihr Fragment aufrufen:
In meinem Fall ersetzt dies nicht die Aktionsleiste der Hauptaktivität, aber es gibt der Symbolleiste einen Titel wie in der Hauptaktivität.
– Roll
18. September 2015 um 13:35 Uhr
@vinitius Hey, in deiner obigen Antwort hast du vergessen, “()” nach getActivity zu schreiben. Bitte fügen Sie dies hinzu, damit andere nicht verwirrt werden.
– Widder Mansawala
28. Oktober 2015 um 10:47 Uhr
Durch das Verschieben von SupportActionBar von der Activity-Symbolleiste in die Fragments-Symbolleiste kann die Unterstützung für die Activity-Symbolleiste verloren gehen. Was ist, wenn Sie die Aktivitätssymbolleiste einmal innerhalb von Fragment mit verschobener SupportActionBar aktualisieren müssen? :).
– Faisal Naseer
26. September 2017 um 6:42 Uhr
Faisal Naseer
Ich habe viele Antworten gesehen, die erwähnt wurden setSupportActionBar für die Symbolleiste im Inneren Fragment Dieser Ansatz kann jedoch schief gehen, wenn Sie eine Symbolleiste verwenden Activity und ein separates Toolbar in Fragment.
Beim Schalten setSupportActionBar von der Aktivitäts-Symbolleiste zur Fragment-Symbolleiste, kann es zu Duplizierungen kommen MenuItem sogar Sie versuchen, mit zu überschreiben setHasOptionsMenu(true).
Zweitens, wenn Sie die Symbolleiste der Aktivität aktualisieren möchten, sehen Sie, dass Ihre Änderungen aufgrund von nicht wiedergegeben werden setSupportActionBar in deinem Fragment.
Um dies zu vermeiden, empfehle ich daher, Toolbar-Methoden wie dieses Inside-Fragment zu verwenden, 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 Toolbar.OnMenuItemClickListener Schnittstelle, um mit menuItems Klickereignisse zu empfangen.
Bearbeiten (Abschnitt aus der Antwort von MrEngineer13 kopiert)
und 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
}
});
Hallo Faisal Naseer, kannst du es im Detail erklären, weil ich vor dem gleichen Problem stehe, das du beschreibst.
– Nes Tyagi
11. September 2017 um 9:17 Uhr
sicher, was das Problem an Ihrem Ende ist, haben Sie den obigen Ansatz ausprobiert.
– Faisal Naseer
22. September 2017 um 11:25 Uhr
Ich habe das Problem mit Ihrem Code von RND gelöst, danke für Ihr Feedback. Eigentlich habe ich nur eine Aktivität und den Rest aller Fragmente in meiner App. Beim Aktualisieren der Symbolleiste mit Optionsmenü in jedem Fragment tritt das Problem auf. Aber mit Ihrem Code funktioniert es gut, danke.
– Nes Tyagi
25. September 2017 um 4:38 Uhr
Basierend auf der Antwort von @Faisal Naseer. Hier ist das vollständige Beispiel (mit wenigen Anmerkungen) für die Verwendung von custom Toolbar
mit Navigation und Speisekarte in Fragment
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)
}
}
}
}
}
ich benutze Kotlin. In meinem Fall ist Activity eine untergeordnete Klasse von AppCompatActivity und Thema der Aktivität wird geerbt Theme.MaterialComponents.DayNight.NoActionBar
Meine Aktivität hat also keine Aktionsleiste, mein Fragment jedoch.
Ich werde Ihnen zeigen, wie Sie die Symbolleiste mit definiertem Menü als SupportActionBar im Fragment verwenden
Dies ist meine Symbolleiste
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:fitsSystemWindows="true"
app:navigationContentDescription="Back to the previous question"
android:background="?attr/colorPrimary"
tools:title="@string/posts" />
Dies sind die Methoden meines Fragments:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(context as AppCompatActivity).setSupportActionBar(_bind?.toolbar)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.toolbar_menu_post_list, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when(item.itemId)
{
R.id.add -> {
val post = Post()
postListViewModel.addPost(post)
callbacks?.onItemSelected(post.id)
return true
}
else -> super.onOptionsItemSelected(item)
}
}
14318500cookie-checkToolbar mit Fragmenten verwendenyes
Gibt es ein Problem damit, es in Ihrem Aktivitätslayout zu haben und es in Ihrer Aktivität festzulegen?
– Tachyonenfluss
12. März 2015 um 21:53 Uhr
Jede Symbolleiste für jeden Viewpager hat eine andere Farbe und andere Menüs, also dachte ich, es wäre besser, sie mit den Fragmenten zu steuern
– Al Hennessey
12. März 2015 um 21:59 Uhr
Moment mal, das ist nicht der springende Punkt in diesem Szenario nicht die einzustellen
ToolBar
wieActionBar
? Da Sie beabsichtigen, dass jedes Fragment sein eigenes hatToolBar
(der zusammen mit dem anderen Inhalt des Fragments wischt), wir sprechen über die ‘eigenständige’ (scrollen Sie nach unten zum Abschnitt „eigenständig“) Verwendung des Widgets.– MH.
12. März 2015 um 22:06 Uhr
Der Menüteil wird bereits mit verschiedenen Menü-XMLs und Anhängen über unterstützt
onCreateOptionsMenu
. Der Farbteil kann innerhalb der durchgeführt werdenonAttach
Verwenden Sie so etwas wie stackoverflow.com/questions/25081706/…– Tachyonenfluss
12. März 2015 um 22:13 Uhr