LayoutInflater的Factory和Factory2有什么不同?

有两个公共接口:
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 ? 他们有什么不同?

Solutions Collecting From Web of "LayoutInflater的Factory和Factory2有什么不同?"

唯一的区别是在Factory2可以configuration新视图的parent view是谁。

用法 –
当您需要将特定的父级设置为您创build的新视图时,请使用Factory2 (仅支持API 11及更高版本)

代码 – LayoutInflater源代码:(删除不相关的代码后)

 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只是使用View parent选项重载Factory

我应该使用哪个工厂?如果我想将自定义工厂设置为LayoutInflater? 他们有什么不同?

如果您需要提供创build视图的父级,则需要使用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); } }