Was soll ich für die Wurzel übergeben, wenn ich ein Layout auflade, das für eine ActionView von MenuItem verwendet werden soll?

Ich habe ein ImageView , das ich an ein MenuItem als seine ActionView (das Item erscheint in der ActionBar ). Das Layout für diese Ansicht stammt aus XML. Ich stelle es so auf:

 ImageView actionView = (ImageView) layoutInflater.inflate( R.layout.action_view_layout, null); 

Das scheint gut zu funktionieren. Aber; Null für die root im Aufruf zum inflate() macht Lint schrei auf mich:

  • So öffnen Sie eine Datei in Android über eine Absicht
  • Benutzerdefinierte Aktionsansicht kann nicht angeklickt werden
  • Vermeiden Sie es, null als View-Root zu übergeben (müssen Layoutparameter auf dem Wurzel-Element des aufgeblasenen Layouts auflösen)

    Ich kann scheinbar ohne eine Wurzel in meinem speziellen Fall zu verwalten, aber ich würde lieber den Code so richtig wie möglich sein. Das Problem ist, ich bin mir nicht sicher, welche View als Wurzel hier verwendet werden soll. Diese Antwort sagt, dass es "das Widget sein sollte, das die Ansichtobjekte umgibt, die Sie aufblasen möchten." Aber was bedeutet das hier? Die eine für die Aktionsleiste? Die Aktivität? Etwas anderes ganz?


    Update: Das Lesen der Antworten hat mich verdächtigt mich das Richtige zu tun ist:

    1. Holen Sie sich die ActionBar View entsprechend dem MenuItem
    2. Holen Sie sich seine Wurzel
    3. Die Wurzel in eine ViewGroup
    4. Übergeben Sie das Ergebnis an den Anströme

    Das scheint zu funktionieren. Kann jemand bestätigen oder leugnen, ob dies geschehen soll?

  • SurfaceView im Layout
  • Wie füttere ich DatePicker-Widget mit anderen Kalendersystemen?
  • Benutzerdefinierte Aktionsansicht kann nicht angeklickt werden
  • Richten Sie das Bild oben auf TextView aus
  • Wie benutzt man benutzerdefinierte Schriftart in android xml?
  • Wie man eine Ansicht mit einem Layout aufzublasen
  • 3 Solutions collect form web for “Was soll ich für die Wurzel übergeben, wenn ich ein Layout auflade, das für eine ActionView von MenuItem verwendet werden soll?”

    Ich würde es einfach so machen:

     menuItem.setActionView(R.layout.action_view_layout); 

    Lassen Sie Android die Ansicht für Sie aufblasen.

    Wenn Sie in diesem ImageView-Aufruf einige zusätzliche Änderungen vornehmen müssen

     ImageView imageView = (ImageView) menuItem.getActionView(); 

    Aktualisieren

    Um deiner Neugierde gerecht zu werden. Das ist, was Leute von Google unter der Kapuze tun:

     public MenuItem setActionView(int resId) { final Context context = mMenu.getContext(); final LayoutInflater inflater = LayoutInflater.from(context); setActionView(inflater.inflate(resId, new LinearLayout(context), false)); return this; } 

    Du hast doch das geschaut. Es erklärt auch die Layout-Inflator.

    Es gibt zwei nutzbare Versionen der inflate() Methode für eine Standardanwendung:

     inflate(int resource, ViewGroup root) inflate(int resource, ViewGroup root, boolean attachToRoot) 

    Der erste Parameter zeigt auf die Layout-Ressource, die Sie aufblasen möchten. Der zweite Parameter ist die Wurzelansicht der Hierarchie, in der du die Ressource aufblasst. Wenn der dritte Parameter vorhanden ist, regelt er, ob die aufgeblasene Ansicht nach der Inflation an die bereitgestellte Wurzel angeschlossen ist oder nicht.

    Es sind diese letzten beiden Parameter, die ein bisschen Verwirrung verursachen können. Mit der beiden Parameterversion dieser Methode versucht LayoutInflater automatisch, die aufgeblasene Ansicht mit dem bereitgestellten Root zu verbinden. Allerdings hat das Framework einen Check-in-Ort, dass, wenn Sie null für die Wurzel passieren, um diesen Versuch zu vermeiden, einen Anwendungsabsturz zu vermeiden.

    Viele Entwickler nehmen dieses Verhalten an, um zu bedeuten, dass der richtige Weg, um die Anhaftung auf die Inflation zu deaktivieren, indem sie Null als Wurzel überschreitet; In vielen Fällen nicht einmal erkennen, dass die drei Parameter-Version von inflate () existiert.

    Mehr zu Layout Inflation

    Du willst in der Regel alles verbringen (ViewGroup Sub-Class) Du wirst ActionView hinzufügen, um zu infizieren. Um actionView zurückzukehren aus dem Aufblasen und nicht die Eltern, die du einen dritten Parameter hinzufügen willst, false, damit es die aufgeblasene Ansicht nicht zum übergeordneten Bild hinzufügt.

     ImageView actionView = (ImageView)layoutInflater.inflate(R.layout.action_view_layout, parent, false); // .. do whatever you like with actionView and then add it to it's parent menuItem.addActionView(actionView) 

    Es gibt eine ziemlich gute Tutorial hier , die über die Dinge ein wenig anders geht. Es spezifiziert action_view_layout als Teil von menu.xml mit so etwas wie:

     android:actionLayout="@layout/action_view_layout" 

    Das kann auch für Sie arbeiten, vorausgesetzt, Sie sind immer mit dem gleichen Layout. Wenn du diesen Weg gehst, kannst du das ActionView dabei machen

     ImageView actionView = menu.findItem(R.id.whatever).getActionView(); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.