web-dev-qa-db-ger.com

Werkzeugleiste mit Fragmenten verwenden

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

25
Al Hennessey

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);
59
vinitius

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. 

  1. Wenn Sie 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.
  2. Zweitens Wenn Sie die Symbolleiste von Activity aktualisieren möchten, werden Ihre Änderungen nicht durch 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
   }
});
24
Faisal Naseer

Mit der neuen AppCompatActivity sollten Sie sie anstelle von ActionBarActivity aufrufen:

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

Sie können mit dieser Funktion eine Symbolleiste in Fragmenten hinzufügen

 ((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);
2
H.T

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

 enter image description here

0
Linh