为什么我们不需要在Android中实例化LayoutInflater?

时间:2016-06-13 09:08:10

标签: java android

我是Android新手..所以我不知道我是否在问一个愚蠢的问题。 无论如何它是.. ..

我们知道..我们在java中实例化一个对象:

Sagar sagarObject = new Sagar();

Sagar是班级

但我刚看到android中的代码是:

LayoutInfalter sagarsInflater = LayoutInflater.from(getContext());

其中layoutInflater是类。

现在我无法理解上面的代码。不应该是这样的:

LayoutInflater sagarsInflater = new LayoutInflater();

为什么我们没有实例化那个对象?为什么使用这种“from”方法并不会自动进行甚至实例化?

另一个例子,

View customView = sagarsInflater.inflate(R.layout.custom_row, parent, false);

这里我们也没有从View类中实例化对象,如:

View customView = new View();

相反,我们使用了之前刚刚制作的sagarsInflater方法。

3 个答案:

答案 0 :(得分:3)

首先,即使你认为自己在问一些非常基本的东西,如果你不知道的话,也绝不会是一个愚蠢的问题。

您应该检查文档以更好地理解LayoutInflater:

https://developer.android.com/reference/android/view/LayoutInflater.html

  

将布局XML文件实例化为其对应的View对象。的它   永远不会直接使用。相反,使用getLayoutInflater()或   getSystemService(Class)检索标准的LayoutInflater实例   已经连接到当前上下文并且正确   为您正在运行的设备配置

因此,您必须从上下文中获取现有实例LayoutInflater,而不是创建新实例。这就是为什么你不能使用像

这样的东西
LayoutInflater inflater = new LayoutInflater();

从文档中您发现访问LayoutInflater的正确方法是:

 LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

但您正在使用LayoutInflater.from(Context context)。如果我们进行实现,我们会找到以下代码:

public static LayoutInflater from(Context context) {
    LayoutInflater LayoutInflater =
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (LayoutInflater == null) {
        throw new AssertionError("LayoutInflater not found.");
    }
    return LayoutInflater;
}

我们可以看到它是从作为参数传递的上下文中检索layoutInflater。

关于调用该方法的方法,它与Class.method类似,因为它被定义为静态。这意味着该方法属于该类,而不属于该对象的实例。

有关此内容的更多信息: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

了解查看相关问题:

您可以实例化对象视图,如

 View view = new View(context);

视图实例将是具有默认属性的视图对象,并且不会附加到任何父视图。例如,您可以使用它来从代码创建动态布局。

为什么使用inflater.inflate(int resource, ViewGroup root, boolean attachToRoot);

因为您想要从xml布局中扩展视图。这就是我们使用LayoutInflater for。

的原因

再次,查看文档以获得更好的解释:

LayoutInflater inflater

希望它有所帮助。

答案 1 :(得分:0)

请查看文档  https://developer.android.com/reference/android/view/LayoutInflater.html

//Obtains the LayoutInflater from the given context.
static LayoutInflater.from(Context context)

它静态使用并且不能单独使用,上下文将返回布局Inflater。

答案 2 :(得分:0)

abstract classLayoutInflater,无法直接实例化。

abstract classes以及许多其他系统“服务”(以interfacesContext的形式)来自您活动的Context

来自“系统”,你不必关心这项服务的实际实施;系统可以为不同的情况提供不同的实现。

这对AudioManager提供的其他一些界面更为重要,例如: SpeechRecognizerabstract等您可以在Context

的文档中看到该列表

View类本身并不具有视觉上的趣味性。它主要用于为子类提供大量“内置”管道(默认实现)以用于常见操作。我认为它也应该是View。您可以通过附加处理程序为其提供某些行为,但通常创建yyyy/MM/dd的子类可以更好地控制自定义。