„setHasOptionsMenu(Boolean): Unit“ ist veraltet. In Java veraltet

Lesezeit: 6 Minuten

Wie deklariere ich ein Menü innerhalb eines Android-Fragments? Die Methode, die ich zuvor verwendet hatte, ist jetzt veraltet.

Ursprünglich:

    override fun onCreateView(...): View {
        setHasOptionsMenu(true)
    }
 override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        this.menu = menu
        inflater.inflate(R.menu.menu, this.menu)
    }

  • Hast du gelesen die Release Notes die mit dem verknüpft sind Code Ausschnitte?

    – ianhanniballake

    18. April um 23:01 Uhr

  • Vielen Dank für die Ressource! @ianhanniballake

    – SUR4IDE

    22. April um 14:19 Uhr

  • Warum genau wurde es verworfen? Ich sehe nichts Besonderes an dem neuen Code …

    – Android-Entwickler

    25. Mai um 1:04 Uhr

Aus der Entwicklerdokumentation kann dies wie folgt erreicht werden:

/**
  * Using the addMenuProvider() API directly in your Activity
  **/
class ExampleActivity : ComponentActivity(R.layout.activity_example) {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Add menu items without overriding methods in the Activity
   addMenuProvider(object : MenuProvider {
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // Add menu items here
        menuInflater.inflate(R.menu.example_menu, menu)
      }

      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
        return true
      }
    })
  }
}

/**
  * Using the addMenuProvider() API in a Fragment
  **/
class ExampleFragment : Fragment(R.layout.fragment_example) {

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // The usage of an interface lets you inject your own implementation
    val menuHost: MenuHost = requireActivity()
  
    // Add menu items without using the Fragment Menu APIs
    // Note how we can tie the MenuProvider to the viewLifecycleOwner
    // and an optional Lifecycle.State (here, RESUMED) to indicate when
    // the menu should be visible
    menuHost.addMenuProvider(object : MenuProvider {
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // Add menu items here
        menuInflater.inflate(R.menu.example_menu, menu)
      }

      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
            return when (menuItem.itemId) {
                R.id.menu_clear -> {
                    // clearCompletedTasks()
                    true
                }
                R.id.menu_refresh -> {
                    // loadTasks(true)
                    true
                }
                else -> false
            }
      }
    }, viewLifecycleOwner, Lifecycle.State.RESUMED)
  }

Fragmente setHasOptionsMenu veraltet, verwenden Sie setHasOptionsMenu

  • Wie sieht es mit anderen Funktionen aus, wie z. B. Invalidierung und Abrufen eines Verweises auf die Menüpunkte? Die gibt es noch, oder auch geändert?

    – Android-Entwickler

    23. Mai um 6:13 Uhr

  • im Fragment müsste ich den Verweis auf das MenuProvider-Objekt behalten, damit ich es entfernen kann, indem ich removeMenuProvider (MenuProvider obj) verwende, weil Menüs über mehrere Fragmente dupliziert werden … Sie wissen, wie das geht? Gerade ausprobiert, aber das Problem besteht immer noch

    – Ricardogabellon

    30. Juni um 14:15 Uhr


  • @riccardogabellone Ich habe ein ähnliches Problem, aber mir ist aufgefallen, dass Sie den Parameter LifecycleOwner einfach an die Funktion addMenuProvider übergeben können, was bedeutet, dass ich in dem Fragment Folgendes verwende: activity!!.addMenuProvider(menuProviderThatYouCreated, this.viewLifecycleOwner)

    – Android-Entwickler

    6. Juli um 20:34 Uhr


  • Was bedeutet Folgendes?: // Durch die Verwendung einer Schnittstelle können Sie Ihre eigene Implementierung einfügen

    – David

    6. Juli um 23:53 Uhr

  • val menuHost: MenuHost = requireActivity() Im Fragment sehe ich, dass es erforderlich ist: MenuHost, aber gefunden: FragmentActivity

    – Dr. Mido

    22. Juli um 11:44 Uhr

Benutzeravatar von Rogue
Schurke

Als Erweiterung dessen, was @joseph-wambura und @hammad-zafar-bawara gesagt haben, können Sie die Schnittstelle auch im Fragment implementieren …

class MyFragment : Fragment(), MenuProvider {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Do stuff...
        val menuHost: MenuHost = requireActivity()
        menuHost.addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)
    }

    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.options, menu)
        // Do stuff...
    }

    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Do stuff...
        return false
    }
}

  • val menuHost: MenuHost = requireActivity() Im Fragment sehe ich, dass es erforderlich ist: MenuHost, aber gefunden: FragmentActivity Wie kann es verwendet werden?

    – Dr. Mido

    22. Juli um 11:45 Uhr

  • Stellen Sie sicher, dass Sie verwenden import androidx.fragment.app.Fragment und nicht die abgeschriebenen import android.app.Fragment

    – Schurke

    23. Juli um 18:37 Uhr

  • Ich nutze das bereits

    – Dr. Mido

    23. Juli um 19:38 Uhr

  • Dies ist eine erzwungene Änderung der ComponentActivity (und damit ihrer Fragmente). Es gibt Entwickler, die CompatActivity immer noch ohne das erzwungene Komponentenframework verwenden, und die Leitfäden erklären nicht, wie dies für dieses Szenario erreicht werden kann. requireActivity() löst in diesem Fall einen Typenkonflikt aus.

    – Schatten

    26. Juli um 19:17 Uhr

  • Die Lösung dafür ist es, so zu gießen val menuHost: MenuHost = requireActivity() as MenuHost

    – Schatten

    26. Juli um 19:51 Uhr

Benutzeravatar von Codelaby
Codelaby

In Kotlin Erklärung für Activity, Fragment und PreferenceFragmentCompat

Aktivität

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

   addMenuProvider(object : MenuProvider {
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.main_menu, menu)
      }

      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
        return true
      }
    })
  }
}

Fragment

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    // The usage of an interface lets you inject your own implementation
    val menuHost: MenuHost = requireActivity()

    //Same Activtiy declaration
    menuHost.addMenuProvider...

PreferenceFragmentCompat

val menuHost: MenuHost = requireHost() as MenuHost
//Same declaration with Fragment

Verwenden Sie die MenuProvider-Schnittstelle

class FirstFragment : Fragment(), MenuProvider {
 
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
              val menuHost: MenuHost = requireActivity()
              menuHost.addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)
      }
 
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // Add menu items here
        menuInflater.inflate(R.menu.second_menu, menu)
      }
 
      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
            return when (menuItem.itemId) {
                R.id.menu_clear -> {
                    // Do stuff...
                    true
                }
                R.id.menu_refresh -> {
                    // Do stuff...
                    true
                }
                else -> false
            }
      }, viewLifecycleOwner, Lifecycle.State.RESUMED)
}

  • Basierend auf meinem Tweet und meinen persönlichen Blog-Notizen, twitter.com/Codelaby/status/…

    – Codelabor

    14. August um 10:47 Uhr

  • Ich habe es aber versucht val menuHost: MenuHost = requireActivity() Fehler geben: Type mismatch: inferred type is FragmentActivity but MenuHost was expected

    – Josua

    13. September um 4:40 Uhr

  • Nach dem Hinzufügen implementation 'androidx.activity:activity-compose:1.5.1' Fehler verschwunden danke

    – Josua

    13. September um 5:22

Benutzeravatar von Hammad Zafar Bawara
Hammad Zafar Bawara

JAVA-CODE

Optionsmenü ein Aktivität

addMenuProvider(new MenuProvider() {
            @Override
            public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
                menuInflater.inflate(R.menu.bottom_nav_menu, menu);

                // Add menu options here

            }

            @Override
            public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {

                // Handle Menu Options Selection Here

                return false;
            }
        });

Optionsmenü ein Fragment

requireActivity().addMenuProvider(new MenuProvider() {
            @Override
            public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
                menuInflater.inflate(R.menu.bottom_nav_menu, menu);
                
                // Add option Menu Here
                
            }

            @Override
            public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
                return false;
                
                // Handle option Menu Here
                
            }
        }, viewLifecycleOwner, Lifecycle.State.RESUMED);

das hilft mir bei der onCreateView-Methode:

requireActivity().addMenuProvider(new MenuProvider() {
        @Override
        public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
            menuInflater.inflate(R.menu.bottom_nav_menu, menu);
            
            // Add option Menu Here
            
        }

        @Override
        public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
                           
            // Handle option Menu Here
             return false;
        }
    }, getViewLifecycleOwner, Lifecycle.State.RESUMED);

  • Was ist, wenn sich der Menüanbieter in der Hauptaktivität befindet und ich nur Code hinzufügen möchte, wenn auf ein Menüelement geklickt wird, wenn das Fragment angezeigt/fokussiert ist? Muss ich in onCreateMenu auch aufblasen?

    – Chitgoks

    2. September um 3:02

Benutzeravatar von Eric B
Erich B.

Wenn Sie Jetpack NavigationUI verwenden, müssen Sie dies tun setSupportActionBar(toolbar)andernfalls wird das Menü nicht angezeigt.

  • Was ist, wenn sich der Menüanbieter in der Hauptaktivität befindet und ich nur Code hinzufügen möchte, wenn auf ein Menüelement geklickt wird, wenn das Fragment angezeigt/fokussiert ist? Muss ich in onCreateMenu auch aufblasen?

    – Chitgoks

    2. September um 3:02

1393740cookie-check„setHasOptionsMenu(Boolean): Unit“ ist veraltet. In Java veraltet

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

Privacy policy