关于 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 的说明的主要内容,如果未能解决你的问题,请参考以下文章