LayoutInflater的Factory和Factory2

时间:2016-08-31 14:57:52

标签: java android layout-inflater

有两个公共接口: 在android sdk中有LayoutInflater.FactoryLayoutInflater.Factory2,但官方文档无法对此接口提供有用的信息,甚至是LayoutInflater文档。

从来源我已经了解如果设置了Factory2,那么它将被使用,否则Factory将被使用:

View view;
if (mFactory2 != null) {
    view = mFactory2.onCreateView(parent, name, context, attrs);
} else if (mFactory != null) {
    view = mFactory.onCreateView(name, context, attrs);
} else {
    view = null;
}

setFactory2()也有非常简洁的文档:

/**
 * Like {@link #setFactory}, but allows you to set a {@link Factory2}
 * interface.
 */
public void setFactory2(Factory2 factory) {


我应该使用哪家工厂如果我想将自定义工厂设置为LayoutInflater? 它们的区别是什么?

2 个答案:

答案 0 :(得分:3)

唯一的区别是,在ax.get_xaxis().get_major_formatter().set_scientific(False) 中,您可以配置新视图的Factory2将是谁。

用法 -
当您需要将特定父级设置为新视图时,请使用parent view 创建。(仅支持API 11及更高版本)

代码 - LayoutInflater来源:(删除无关代码后)

Factory2

现在public interface Factory { // @return View Newly created view. public View onCreateView(String name, Context context, AttributeSet attrs); }

Factory2

现在您可以看到public interface Factory2 extends Factory { // @param parent The parent that the created view will be placed in. // @return View Newly created view. public View onCreateView(View parent, String name, Context context, AttributeSet attrs); } 只是Factory2的{​​{1}}选项超载。

答案 1 :(得分:2)

  

我应该使用哪个工厂如果我想将自定义工厂设置为   LayoutInflater?它们的区别是什么?

如果您需要提供将创建视图的父级,您需要使用Factory2。但如果您的定位API级别为11+,则通常会使用Factory2。否则,只需使用Factory

以下是Factory

class MyLayoutInflaterFactory implements LayoutInflater.Factory {

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if (TextUtils.equals(name, "MyCustomLayout")) {
            return new MyCustomLayout(context, attrs);
        }
        // and so on...
        return super.onCreateView(name, context attrs);
    }
}

以下是Factory2

class MyLayoutInflaterFactory2 implements LayoutInflater.Factory2 {

    @Override
    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
        if (TextUtils.equals(name, "MyCustomLayout")) {
            return new MyCustomLayout(context, attrs);
        }
        // and so on...
        return super.onCreateView(parent, name, context, attrs);
    }
}