我已经创建了这个自定义布局Inflater工厂类,并按照文档中的建议将其设置为Layout Inflater的克隆。 APP运行,但onCreateView永远不会在我的自定义类上调用。
研究LayoutInflater.java我可以看到它应该从createViewFromTag调用,但是在执行此方法的情况下很难跟踪。
我尝试自定义的菜单是Action Overflow菜单。
知道可能出现什么问题吗?
我的定制Inflater工厂类:
public class MyLayoutInflaterFactory implements LayoutInflater.Factory {
public View onCreateView(String name, Context context,
AttributeSet attrs) {
if (name.equalsIgnoreCase(
"com.android.internal.view.menu.IconMenuItemView")) {
try {
LayoutInflater li = LayoutInflater.from(context);
final View view = li.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
view.setBackgroundResource(R.drawable.banner_kid_yellow_blue);
((TextView) view).setTextSize(20);
Typeface face = MyApplication.getDefaultTypeface();
((TextView) view).setTypeface(face);
((TextView) view).setTextColor(Color.WHITE);
}
});
return view;
} catch (InflateException e) {
//Handle any inflation exception here
} catch (ClassNotFoundException e) {
//Handle any ClassNotFoundException here
}
}
return null;
}
}
我的OnCreateMenuOptions方法:
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbar_menu, menu);
LayoutInflater inflaterClone = getLayoutInflater().cloneInContext(getLayoutInflater().getContext());
LayoutInflater.Factory lif = new MyLayoutInflaterFactory();
inflaterClone.setFactory(lif);
return super.onCreateOptionsMenu(menu);
}
谢谢大家!
答案 0 :(得分:1)
onCreateView仅在布局使用已设置出厂设置的inflator对象进行充气时才会被调用。
视图应该在 setContentView 之前膨胀。
在您的情况下,您可以在setContentView之前扩展菜单布局并存储自定义标记数据以供将来使用。
在setContentView()
之前在你的on create中编写代码LayoutInflater inflater = LayoutInflater.from(this);
if (inflater.getFactory() != null) {
inflater = inflater.cloneInContext(this);
}
inflater.setFactory(<your factory class object>);
View v = inflater.inflate(<your layout>, null);
希望它有所帮助。
答案 1 :(得分:0)
您必须在活动onCreateView中手动调用工厂onCreateView。因为活动的onCreateView默认返回null,所以如果你想要其他明智的话,你可以这样做
@Nullable
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if(name.contains("ActionMenuItemView")) {
LayoutInflater li = LayoutInflater.from(context);
View view = null;
try {
view = li.createView(name, null, attrs);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (view != null) {
if(factory != null) {
view = mFactory.onCreateView(name,context,attrs);
}
return view;
}
}
return super.onCreateView(name, context, attrs);
}
将检查LayoutInflater是否可以创建视图然后触发工厂onCreateView进行编辑
答案 2 :(得分:-4)
请在声明公共类onCreateView之前添加@Override。