Cosa devo passare per root gonfiare un layout da utilizzare per ActionView di un MenuItem ?

? dlf @ | Original: StackOverFlow
---

Ho un ImageView che attribuisco ad un MenuItem come ActionView ( la voce appare nel ActionBar ) . Il layout di questa visione viene da XML . Sto gonfiare in questo modo:

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

Questo sembra funzionare bene . Tuttavia ; passando null per root nella chiamata a inflate() fa Lint urlare a me :

Evitare passando null come radice view ( bisogno di risolvere il layout   parametri elemento principale del formato gonfiato )

Posso gestire apparentemente senza una radice nel mio caso specifico, ma preferirei avere il codice di essere il più preciso possibile . Il problema è, non sono sicuro che View dovrebbe essere utilizzato come radice qui . http://stackoverflow.com/a/22615080/3549027 dice che dovrebbe essere " il widget che circonda gli oggetti di visualizzazione che si desidera a gonfiare . " Ma che cosa significa questo ? L' uno per la barra delle azioni ? L'attività ? Qualcosa di completamente diverso ?

Update: Leggendo le risposte mi ha fatto mi sospetto che la cosa giusta da fare è :

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

Questo sembra funzionare . Qualcuno può confermare o smentire se questo è ciò che dovrebbe essere fatto ?

---

Top 5 Risposta

1user2399268 @

In genere vuole passare tutto ciò ( ViewGroup sotto-classe ) si sta andando ad essere l'aggiunta ActionView al gonfiare . al fine di ottenere ActionView indietro dalla chiamata gonfiare e non il genitore si vorrà aggiungere un 3 ° parametro, falso, in modo che non aggiungerà la vista gonfiato al genitore .

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)

C'è una buona http://wptrafficanalyzer.in/blog/adding-custom-action-view-to-action-bar-in-android/ tutorial che va circa le cose un po 'diverso . E ' specificando action_view_layout come parte di menu.xml con qualcosa di simile :

android:actionLayout="@layout/action_view_layout"

Che può anche funzionare per voi a condizione che si sta utilizzando sempre lo stesso layout . se si va questa strada si sarebbe in grado di ottenere il ActionView facendo

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

Hai sguardo su questo . piacevolmente spiega il gonfiatore layout pure .

Ci sono due versioni utilizzabili del metodo inflate() per una applicazione standard :

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

I primi punti dei parametri per la risorsa layout che si desidera a gonfiare . Il secondo parametro è la vista principale della gerarchia che si sta gonfiando la risorsa da allegare al . Quando il terzo parametro è presente, governa anche la vista gonfiato è fissato alla radice fornito dopo il gonfiaggio .

Sono questi ultimi due parametri che possono causare un po ' di confusione . Con la versione a due parametri di questo metodo, LayoutInflater tenta automaticamente di collegare la vista gonfiato alla radice in dotazione . Tuttavia, il quadro ha un controllo sul posto che se si passa null per la radice si ignora questo tentativo di evitare un crash dell'applicazione .

Molti sviluppatori hanno questo comportamento nel senso che il modo corretto di disabilitare attaccamento sull'inflazione è passando null come root ; in molti casi nemmeno rendersi conto che la versione a tre parametri di gonfiaggio ( ) esiste .

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

3Loop @

Vorrei semplicemente fare in questo modo :

menuItem.setActionView(R.layout.action_view_layout);

Lasciate Android gonfiare la vista per voi .

Se avete bisogno di fare alcune modifiche in più su questa chiamata ImageView

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

Update

Al fine di soddisfare la vostra curiosità . Questo è ciò che la gente di Google fanno sotto il cofano :

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