为什么我的自定义Layoutinflater Factory onCreateView永远不会被执行?

时间:2014-12-01 12:30:43

标签: android layout-inflater

我已经创建了这个自定义布局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);
}

谢谢大家!

3 个答案:

答案 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。