То, что я должен пройти для корня во время накачивания макет, используемый для ActionViewMENUITEM -х годов ?

? dlf @ | Original: StackOverFlow
---

У меня естьImageView, что я придаюMenuItem как его ActionView (пункт появляется вActionBar ) . Макет этой точки зрения исходит от XML. Я раздувая его следующим образом :

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

Это, кажется, работает хорошо. Однако ; проходя NULL для root в вызове inflate() делает Lint кричать на меня :

Избегайте прохождения нулевой, как вид корня ( необходимо решить макет   Параметры в корневом элементе завышенным макета )

Я могу, казалось бы, обойтись без корня в моем конкретном случае, но я предпочел бы иметькод быть точными . Проблема в том, что я не уверен, какой View следует использовать в качестве корня здесь. http://stackoverflow.com/a/22615080/3549027 говорит, что это должно быть "виджет, который окружает объекты представления, которое требуется, чтобы раздуть ». Но что это значит здесь? Один для панели действий ? Занятие? Что-то совсем другое ?

Обновление: Чтение ответы сделало меня подозревать меня, что нужно сделать, это :

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

Это похоже на работу . Может кто-нибудь подтвердить или опровергнуть, является ли это то, что должно быть сделано ?

---

Top 5 ответ

1user2399268 @

Как правило, вы хотите, чтобы пройти все ( ViewGroup суб- класс ), вы будете добавлять ActionView в надуть . для того, чтобы получить ActionView назад от призыва надуть и неродитель, вы хотите, чтобы добавить третий параметр, ложной, так что он не будет добавить раздутый вид на родителя.

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)

Там этоочень хороший учебник http://wptrafficanalyzer.in/blog/adding-custom-action-view-to-action-bar-in-android/, что идет о вещах,немного по-другому . Это указав action_view_layout в рамках menu.xml что-то вроде :

android:actionLayout="@layout/action_view_layout"

Это может также работать для вас если вы будете всегда использовать один и тот же макет. если вы идете по этому пути вы сможете получитьActionView, делая

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

Вы должны смотреть на это . это хорошо объясняет Макет INFLATOR, а также.

Есть два используемые варианты метода inflate() для стандартного применения:

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

Первые параметр указывает на ресурс макета вы хотите, чтобы раздуть . Вторым параметром являетсякорнем вид иерархии вы раздувания ресурс приложить к . Когда третий параметр присутствует, он управляет ли или ненадут вид прикреплен к корню, подаваемого после наполнения .

Именно эти два последних параметра, которые могут вызвать немного путаницы. С двух параметров версии этого метода, LayoutInflater автоматически попытается присоединить завышенные вид на поставки корня. Тем не менее,структура имеет чек на месте, что, если вы проходите NULL для корня она обходит эту попытку, чтобы не допустить сбоя приложения .

Многие разработчики принять такое поведение означает, чтоправильный способ отключить приложение на инфляцию является передача NULL в качестве корня ; во многих случаях даже не понимая, чтотри параметра версия Inflate () существует.

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

3Loop @

Я просто делаю это так :

menuItem.setActionView(R.layout.action_view_layout);

Пусть Android раздувать взгляд для вас .

Если вам нужно сделать некоторые дополнительные изменения на этой ImageView вызова

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

Update

Для того, чтобы удовлетворить ваше любопытство . Это то, что люди из Google сделать под капотом :

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