当我创建一个类时,假设A a = new A();
应该创建实际的对象并为其分配内存,我必须执行以下过程:
ListView list;
list = findViewById(R.id.listView);
现在,通过变量a,我可以直接引用该对象。
但是,当我有情况时:
* { text-size-adjust: 200%; }
#navigation{
background-color: white;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25)
}
#navigation ul{
display: flex;
}
#navigation a{
color: black;
text-decoration: none;
font-size: 25px;
}
#navigation a:visited{
color: black;
}
在列表变量声明期间是否创建了对象?有人可以对此发表评论吗?因为有了这个陈述,我在一个教程中认识了。
答案 0 :(得分:3)
所有变量都引用Java中的对象。
例如:
ListView list;
list = findViewById(R.id.listView);
第一条语句不会创建任何新对象,即:findViewById
将不会创建ListView
的新实例,实际上,ListView
对象是在您调用setContentView(R.layout.xx)
,Android在幕后遍历布局XML并为每个标签创建相应的对象。
因此,setContentView(xx)
之后,您已经在内存中拥有一个ListView
实例。
执行list = findViewById(R.id.listview)
时,方法findViewById
返回ListView
的引用,并将引用传递给list
,因此列表现在引用{{ 1}}对象。
如果您想更清楚地了解它,建议阅读ListView
中的相关章节,以清楚地阐明这种关系。
答案 1 :(得分:1)
@LiuWenbin_NO的回答完美地描述了这种情况。但是,我认为我可能会为此提供更多信息。
setContentView
在View
的{{1}}函数中调用时创建onCreate
实例。它使用布局资源ID或单个Activity
作为参数并扩大视图。为了更清楚地理解,仅View
就足以让您的setContentView
用您在布局文件中设计的静态视图填充Android屏幕?因此,如果要修改布局中的某些内容,则可以引用视图并相应地修改视图。
Activity
仅创建Listview list;
类型的变量(请注意,每个布局实例都扩展了ListView
)。调用View
函数后,它将创建膨胀视图的引用,并使用setContentView
,您将获得这些视图的引用。
以前,我们必须在使用findViewById
时强制转换为特定的视图类型,这对于较新版本的Android SDK而言不是必需的。因此,当您声明findViewById
时不会创建该对象,而是在调用ListView list
时创建的。
如果您要先创建视图实例,然后再对其进行充气,则也可以使用setContentView
进行操作。例如,看下面的代码。
setContentView
通过这种方式,您只能将单个视图实例传递给TextView tv = new TextView(this);
setContentView(tv);
// Modify the TextView?
tv.setText("Hello there");
函数。因此,要获得具有多个控件的复杂布局,您需要使用布局。
在setContentView
中使用布局资源会使应用程序逻辑与表示层脱钩。
我强烈建议this book以便更好地理解。