Toolbar mit Fragmenten verwenden

Lesezeit: 7 Minuten

Benutzeravatar von Al Hennessey
Al Hennessey

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

Benutzeravatar von vinitius
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:

 ((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);

AKTUALISIEREN

Wenn Sie verwenden AppCompatActivity :

 ((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);

  • 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

Benutzeravatar von Faisal Naseer
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.

  1. 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).
  2. 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

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>

StartseiteFragment.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>

Hoffe es hilft

Geben Sie hier die Bildbeschreibung ein

  • Hallo, das Aufblasen-Menü funktioniert sehr gut, aber setOnMenuItemClickListener funktioniert nicht. Brauche Hilfe.

    – a-rohim

    10. Oktober 2019 um 10:51 Uhr


  • Auch für ein einzelnes Menü wird ein Überlaufmenü angezeigt. Ich möchte kein Überlaufmenü, was kann ich tun, um das zu erreichen?

    – akshay

    29. Mai 2020 um 4:29 Uhr

  • Wie wäre es, wenn ich den Rückwärtspfeil nicht will, wie kann ich ihn verstecken? Ich brauche nur drei Punkte

    – iamkdblue

    6. Juli 2020 um 12:52 Uhr

  • @Phan, wo ist BaseFragment, kannst du mir das auch geben? Da toolbar_home findet sich hier in diesem Beispiel nicht.

    – AndyBoy

    12. September 2020 um 18:34 Uhr

Bei der neuen AppCompatActivity sollten Sie diese anstelle von ActionBarActivity aufrufen:

((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);

Sie können damit eine Symbolleiste in Fragmenten hinzufügen

 ((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);

Benutzeravatar von amsuredev
amsuredev

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

1431850cookie-checkToolbar mit Fragmenten verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy