我是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方法。
答案 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。
再次,查看文档以获得更好的解释:
希望它有所帮助。
答案 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 class
是LayoutInflater
,无法直接实例化。
abstract classes
以及许多其他系统“服务”(以interfaces
和Context
的形式)来自您活动的Context
。
来自“系统”,你不必关心这项服务的实际实施;系统可以为不同的情况提供不同的实现。
这对AudioManager
提供的其他一些界面更为重要,例如: SpeechRecognizer
,abstract
等您可以在Context
View
类本身并不具有视觉上的趣味性。它主要用于为子类提供大量“内置”管道(默认实现)以用于常见操作。我认为它也应该是View
。您可以通过附加处理程序为其提供某些行为,但通常创建yyyy/MM/dd
的子类可以更好地控制自定义。