O que devo passar para o root ao inflar um layout a ser utilizado para ActionView um MenuItem ?

? dlf @ | Original: StackOverFlow
---

Eu tenho um ImageView que atribuo a um MenuItem como seu ActionView (o item aparece na ActionBar ) . O layout para essa visão vem de XML. Estou inflando -o assim:

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

Isso parece funcionar bem. No entanto ; passando nulo para root na chamada para inflate() faz Lint gritar comigo :

Evite passar null como a raiz vista (necessidade de resolver o layout   parâmetros no elemento raiz do esquema inflado )

I aparentemente pode administrar sem uma raiz no meu caso específico, mas eu prefiro ter o código ser a mais correcta possível . O problema é que eu não tenho certeza de que View deve ser usado como a raiz aqui. http://stackoverflow.com/a/22615080/3549027 diz que deve ser " o widget que está cercando os objetos exibição que você deseja para inflar ". Mas o que significa isso aqui? A um para a barra de ação ? A atividade ? Algo totalmente diferente?

Update: Lendo as respostas me fez suspeitar de mim a coisa certa a fazer é :

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

Isso parece funcionar . Alguém pode confirmar ou negar se isso é o que deve ser feito?

---

Top 5 Responder

1user2399268 @

Você geralmente quer passar o que quer ( ViewGroup sub- classe ) você vai estar adicionando ActionView no para inflar . a fim de obter ActionView volta da chamada inflar e não o pai, você vai querer adicionar um terceiro parâmetro, falso, de modo que não irá adicionar a visão inflada ao pai.

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)

Há um bom http://wptrafficanalyzer.in/blog/adding-custom-action-view-to-action-bar-in-android/ tutorial que vai sobre as coisas um pouco diferente. É especificando action_view_layout como parte da menu.xml com algo como:

android:actionLayout="@layout/action_view_layout"

Isso também pode funcionar para você desde que você está sempre usando o mesmo layout. se você ir por esse caminho que você seria capaz de obter o ActionView, fazendo

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

Você tem olhar sobre este assunto. -lo muito bem explica a insuflação de layout também.

Há duas versões utilizáveis ​​do método inflate() para um pedido normal :

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

O primeiro parâmetro aponta para o recurso de layout que você deseja para inflar . O segundo parâmetro é a visão de raiz da hierarquia você está inflando o recurso para anexar. Quando o terceiro parâmetro está presente, que governa se ou não o ponto de vista insuflado está ligado à raiz fornecido após a inflação .

São estes dois últimos parâmetros que podem causar um pouco de confusão . Com a versão de dois parâmetros deste método, LayoutInflater tentará automaticamente para fixar a visão inflada para a raiz fornecido. No entanto, o quadro tem um cheque no lugar que se você passar nulo para a raiz ignora essa tentativa de evitar o colapso do aplicativo .

Muitos desenvolvedores tomar esse comportamento no sentido de que a maneira correta de desativar penhora sobre a inflação é pela passagem nulo como raiz ; em muitos casos, nem mesmo perceber que existe a versão de três parâmetro de inflar ().

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

3Loop @

Gostaria apenas de fazê-lo assim :

menuItem.setActionView(R.layout.action_view_layout);

Vamos Android inflar a vista para você.

Se você precisa fazer algumas alterações extra nesta chamada ImageView

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

Update

A fim de atender a sua curiosidade. Isso é o que pessoas de Google fazer sob o capô :

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