关于 setContentView 的说明

Posted

技术标签:

【中文标题】关于 setContentView 的说明【英文标题】:Clarification regarding setContentView 【发布时间】:2019-08-29 21:09:33 【问题描述】:

有什么区别:

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text); 

TextView textView = new TextView(this);
setContentView(textView);

我找到了这两段代码。首先,setContentView 有一个我传递给它的关于布局的信息。在第二种情况下,它有一个作为参数传递的视图。 textView 也是一个 id。我认为不同之处在于,在第一种情况下,它是 XML 文件中描述的 activity_main 的布局(也包含 textView),而在第二种情况下,它是 textView 的 id。告诉我我是否正确。

还告诉我这里的“this”指的是什么。为什么我们在第一种情况下使用findViewById

【问题讨论】:

【参考方案1】:

在第一个代码中,

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text); 

您正在设置容器的内容视图,然后尝试使用 ID - 文本访问视图。

例如:

<RelativeLayout android:
android:>
<TextView
android:id="@+id/text" 
android:text="Hello"
android:
android:/>
</RelativeLayout>

在这个布局文件中,TextView 的 id - text 因此,为了以编程方式访问文本视图,我们使用 findViewById() t 来获取对视图的引用。

TextView textView = findViewById(R.id.text);

现在我们可以利用这个视图引用来更改视图。 例如,我们可以更改文本,例如,

textView.setText("This is a test");

至于

TextView textView2 = new TextView(this);

担心,您正在动态创建 TextView。这可以在需要时添加到父容器中。

【讨论】:

感谢您的回答。你能解释一下'this'在这里指的是什么吗?对于第二种情况,我们是否需要在XML中添加textView布局? 这是指当前上下文。在这种情况下,this 指的是应用程序上下文。为了给视图充气,我们需要上下文,这就是我们传递应用程序上下文的原因。 第二种情况不需要 XML 布局。 Textview 可以动态创建并设置为内容视图。 第二种情况下 textView 的 ID 是多少?如果我想给 textView 设置一个字符串值? 以编程方式创建 TextView 时不会设置 ID。如果您愿意,可以使用setId() 设置 ID。【参考方案2】:

Activity.setContentView() 有 2 个签名。一种是以layout id为参数,另一种是以View为参数。实际上还有第三个以 View 和 ViewGroup.LayoutParam 作为输入。

所有三个方法都采用他们得到的东西(一个视图或一个布局来膨胀)并将其设置为他们的根元素。简而言之:这里没有真正的区别。开发人员可以选择几个选项来告诉 Activity 其根 UI 元素

另见:setContentView description

TextView txtView = (TextView)findViewById(R.id.text); 行随后在 Activity 内容中搜索 ID 为“text”的 TextView(在这种情况下,R.layout.activity_main 中的每个视图)。

TextView textView = new TextView(this); 行以编程方式创建新的 TextView,而不是膨胀布局 xml。 this 参数是一个 Context 实例。创建视图总是需要一个 Context 实例。一个 Activity 就是一个上下文。

【讨论】:

你能解释一下this 指的是什么 谢谢!所以这意味着在第二种情况下我不需要在 xml 中添加 textView 是的。在第二种情况下,TextView 实际上是 Activity 的全部内容。当您有一个仅包含 TextView 的 xml 并通过 setContentView() 设置此 xml 时,您将获得相同的结果【参考方案3】:

当您使用以下内容时:

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text);

您正在使用activity_main 布局作为活动的内容。每当您尝试使用findViewByid() 绑定视图时,它只会搜索布局内的视图,如果您尝试绑定布局外的视图,则会出现错误。详情请见setContentView (int layoutResID)。


当您使用以下内容时:

TextView textView = new TextView(this);
setContentView(textView);

您正在使用new TextView(this); 创建一个将活动 (this) 作为 context 的 TextView。请注意,每当您创建视图时,您总是需要上下文。

然后使用setContentView(textView);textView 设置为活动的唯一内容。详情请见setContentView (View view)。

【讨论】:

以上是关于关于 setContentView 的说明的主要内容,如果未能解决你的问题,请参考以下文章

1.Android 视图及View绘制分析笔记之setContentView

eclipse如何自动添加函数

setContentView加载解析过程源码分析

SetContentView流程及应用换肤

SetContentView流程及应用换肤

setContentView和inflate区别: