【问题标题】:Clarification regarding setContentView关于 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

【问题讨论】:

    标签: android setcontentview


    【解决方案1】:

    在第一个代码中,

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

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

    例如:

    <RelativeLayout android:height="match_parent"
    android:width="match_parent">
    <TextView
    android:id="@+id/text" 
    android:text="Hello"
    android:height="wrap_content"
    android:width="wrap_content"/>
    </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)

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多