Was soll ich vorbei für root beim Aufblasen ein Layout für ein MenuItem der Actionview verwenden ?

? dlf @ | Original: StackOverFlow
---

Ich habe ein ImageView, dass ich der ein MenuItem als ActionView (die Artikel erscheint in der ActionBar). Das Layout für diese Ansicht kommt von XML . Ich Aufblasen es etwa so:

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

Dies scheint gut zu funktionieren . Allerdings ; die Eingabe von null für root in dem Aufruf von inflate() macht Lint schreien mich an:

Vermeiden Sie die Eingabe von null wie der Blick root ( müssen das Layout zu lösen   Parameter Root-Element des aufgeblasenen Layouts )

Ich kann anscheinend zu verwalten ohne Wurzel in meinem speziellen Fall, aber ich hätte lieber den Code so korrekt wie möglich zu sein . Das Problem ist, ich bin nicht sicher, welche View sollte als root hier verwendet werden. http://stackoverflow.com/a/22615080/3549027 sagt, dass es sein sollte " das Widget, das die Ansicht Objekte, die Sie aufblasen wollen umgibt . " Aber was heißt das hier, das? Die eine für die Aktionsleiste ? Die Aktivität ? Etwas ganz anderes ?

Update: Lesen Sie die Antworten hat mich vermuten, mir das Richtige zu tun ist :

Get the ActionBar View corresponding to the MenuItem Get its root Cast the root to a ViewGroup Pass the result to the inflater

Dies scheint zu funktionieren. Kann jemand bestätigen oder dementieren, ob das ist, was ist zu tun?

---

Top 5 Antwort

1user2399268 @

Sie wollen in der Regel zu übergeben, was auch immer ( Viewgroup -Unterklasse) du gehst zu Hinzufügen Actionview in aufgeblasen sind . um Actionview vom aufblasen Anruf und nicht die Mutter Sie wollen einen dritten Parameter, falsche hinzuzufügen, so dass sie den aufgeblasenen Blick auf das übergeordnete nicht hinzufügen zurück.

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 ist ein ziemlich gutes Tutorial http://wptrafficanalyzer.in/blog/adding-custom-action-view-to-action-bar-in-android/, die über die Dinge ein wenig anders geht . Es wird die Angabe action_view_layout im Rahmen von menu.xml mit so etwas wie :

android:actionLayout="@layout/action_view_layout"

Das kann auch für Sie arbeiten Sie immer mit dem gleichen Layout sind vorgesehen . Wenn Sie diesen Weg gehen Sie in der Lage, die ActionView, indem Sie bekommen würde

ImageView actionView = menu.findItem(R.id.whatever).getActionView();
2Top Cat @

Sie haben Blick auf diese . es schön erklärt die Layout- Inflator auch.

Es gibt zwei Versionen der nutzbare inflate() Verfahren für eine Standard- Anwendung :

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

Die ersten Parameter zeigt auf die Layout Ressource, die Sie aufblasen wollen . Der zweite Parameter ist die Stammansicht der Hierarchie Sie Aufblasen der Ressource zu befestigen sind . Wenn der dritte Parameter vorhanden ist, regelt es, ob die aufgeblasene Ansicht wird nach dem Aufblasen des mitgelieferten Wurzel befestigt .

Es sind diese beiden letzten Parameter, die ein bisschen Verwirrung stiften kann . Mit der zwei Parameter Version dieses Verfahrens wird LayoutInflater automatisch das aufgeblasene Ansicht der zugeführten Wurzel befestigen. Hat der Rahmen jedoch eine Kontrolle an Ort und Stelle, wenn Sie für das Root- null übergeben es diesen Versuch, eine Anwendung zu Absturz zu vermeiden umgeht .

Viele Entwickler nehmen dieses Verhalten zu verstehen, dass der richtige Weg, um die Befestigung auf die Inflation zu deaktivieren ist, indem null als root ; in vielen Fällen nicht einmal realisieren, dass die drei Parameter Version inflate ( ) existiert.

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

3Loop @

Ich würde einfach so:

menuItem.setActionView(R.layout.action_view_layout);

Lassen Android aufblasen den Blick für Sie.

Wenn Sie zusätzliche Änderungen an diesem Imageview Aufruf tun müssen

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

Update

Um Ihre Neugier gerecht zu werden. Das ist, was die Leute von Google unter der Haube zu 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;
}