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

Ho un ImageView che mi ActionView a un MenuItem come ActionView (l'elemento viene visualizzato in ActionBar ). Il layout per questa visualizzazione viene da XML. Sto gonfiando così:

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

Questo sembra funzionare bene. Però; passando null per la root nella chiamata a inflate() fa Lint gridare a me:

  • Ottieni la dimensione in byte della pagina web in Android
  • Serialize Query-Parameter in Retrofit
  • Come get il nome della risorsa dall'ID della risorsa
  • come disegnare la linea sull'image con il dito in android
  • Tema di dialogo di connessione di MediaRouteActionProvider
  • Debug nel browser di magazzino su un Samsung Galaxy S4 su KitKat
  • Evitare di passare null come root della vista (occorre risolvere i parametri di layout sull'elemento radice del layout gonfiato)

    Posso apparentemente gestire senza una radice nel mio caso specifico, ma preferirei che il codice sia il più corretto ansible. Il problema è che non sono sicuro che la View dovrebbe essere utilizzata come root qui. Questa risposta dice che dovrebbe essere "il widget che circonda gli oggetti di visualizzazione che si desidera gonfiare". Ma cosa significa qui? Quello per la barra d'azione? L'attività? Qualcosa altro?


    Aggiornamento: leggendo le risposte mi ha fatto sospettare che la cosa giusta da fare è:

    1. Ottieni la View ActionBar corrispondente al MenuItem
    2. Prendi la sua radice
    3. ViewGroup la radice in un ViewGroup
    4. Passare il risultato al gonfiatore

    Questo sembra funzionare. Può chiunque confermare o negare se questo è ciò che dovrebbe essere fatto?

  • Android: URI per aprire un'image con ACTION View
  • Non è ansible fare clic su Azione azione personalizzata
  • 3 Solutions collect form web for “Cosa devo passare per root quando inflido un layout da utilizzare per un ActionView di MenuItem?”

    Vorrei semplicemente farlo così:

     menuItem.setActionView(R.layout.action_view_layout); 

    Lasciate che l'Android getta la vista per te.

    Se è necessario apportre alcune modifiche supplementari in questa chiamata di ImageView

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

    Aggiornare

    Al fine di soddisfare la tua curiosità. Questo è ciò che le persone 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; } 

    Hai guardato questo. ben spiega anche il Layer Inflator.

    Esistono due versioni utilizzabili del metodo inflate() per un'applicazione standard:

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

    Il primo parametro indica la risorsa di layout che si desidera far gonfiare. Il secondo parametro è la vista di root della gerarchia in cui si gonfia la risorsa da colbind. Quando il terzo parametro è presente, determina se la vista gonfiata viene collegata alla radice fornita dopo l'inflazione.

    Sono questi ultimi due parametri che possono causare un po 'di confusione. Con la versione a due parametri di questo metodo, LayoutInflater cercherà automaticamente di colbind la vista gonfiata alla radice fornita. Tuttavia, il framework ha un controllo in atto che se si passa null per la radice esso bypasses questo tentativo di evitare un crash dell'applicazione.

    Molti sviluppatori prendono questo comportmento per significare che il modo corretto di distriggersre l'attaccamento sull'inflazione è passando null come root; in molti casi persino non rendersi conto che esiste la versione dei tre parametri di infllate ().

    Maggiori informazioni sull'inflazione del layout

    In genere desideri passare qualunque cosa (sotto-class ViewGroup) stai aggiungendo actionView per inflazionare. per get l'actionView dalla chiamata a gonfiaggio e non al genitore, si desidera aggiungere un terzo parametro, falso, in modo che non aggiunga la vista gonfiata 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'è un tutorial abbastanza buono qui che va in giro per le cose un po 'diversamente. Specifica action_view_layout come parte di menu.xml con qualcosa di simile:

     android:actionLayout="@layout/action_view_layout" 

    Può anche funzionare per te, sempre che utilizzi sempre lo stesso layout. se andate quell'itinerario sarai in grado di get l' ActionView facendo

     ImageView actionView = menu.findItem(R.id.whatever).getActionView(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.