【问题标题】:Problems Adding TextView Programmatically Without Erasing Views in XML - Android以编程方式添加 TextView 而不擦除 XML 中的视图的问题 - Android
【发布时间】:2014-05-13 07:06:29
【问题描述】:

我正在尝试以编程方式添加 TextView,但事实证明这非常困难。我找到了可以在这里工作的代码(添加到onCreate):

LinearLayout thisLayout = new LinearLayout(this);
setContentView(thisLayout);
TextView dynamicTextView = new TextView(this);
dynamicTextView.setText("Dynamically Added TextView");
thisLayout.addView(dynamicTextView);

问题是这会删除我在 XML 中创建的所有视图。有一个受欢迎的问题,得到高度评价的答案HERE。基于此,我创建了这个:

LinearLayout myLayout = findViewById(R.layout.activity_main);

TextView tv = new TextView(this);
tv.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT,
        LinearLayout.LayoutParams.FILL_PARENT));
tv.setText("Trying Again");
myLayout.addView(tv);

但是这一行有错误:

LinearLayout myLayout = findViewById(R.layout.activity_main);

我尝试像这样投射它,这会消除错误,但会立即崩溃:

LinearLayout myLayout = (LinearLayout) findViewById(R.layout.activity_main);

我很好奇我做错了什么。我意识到那里有很多类似的问题,但它们似乎都不起作用,而且很多都指向我在这里连接的答案。我遇到的问题是答案根本不起作用。另外,我正在熟悉 Android 环境,所以如果我正在做的任何事情看起来“不正常”,请指出。

这是我的 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="lowri.morepractice.app.MainActivity">

    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage"/>

</LinearLayout>

对于其他来这里的人,我还必须将布局参数更改为:

tv.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.WRAP_CONTENT));

【问题讨论】:

  • 请出示您的 xml。

标签: android


【解决方案1】:

您不能通过 id 请求布局。它不指向 LinearLayout。

要真正获得 LinearLayout,您必须为其添加一个 id

<LinearLayout
    android:id="@+id/edit_linearlayout"
    ....

并提出类似的要求:

LinearLayout myLayout = (LinearLayout) findViewById(R.id.edit_linearlayout);

要添加 TextView,您必须像您发布的问题一样设置 LayoutParams。当然不必是 FILL_PARENT:

TextView tv = new TextView(this);
tv.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.FILL_PARENT));
tv.setText("Trying Again");
myLayout.addView(tv);

【讨论】:

  • 谢谢,这行得通。我还在我的问题中添加了一小段代码,这也导致了问题。也许您想在回答中提及它。不管怎样,谢谢!
【解决方案2】:

错误是因为您正在资源中查找 XML 文件。

试试这个,

在您的代码中:

LinearLayout myLayout = (LinearLayout) findViewById(R.id.layout_main);

在您的 XML 中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_main"
android:layout_width="match_parent"

【讨论】:

    【解决方案3】:

    您使用的 xml 和 LinearLayout 错误。

    1- 调用它来将你的 xml 设置为内容视图

    setContentView(R.layout.activity_main);
    

    2- 给你的线性布局一个 id

    android:id="@+id/myLinearLayout"
    

    3- 找到像这样的线性布局

    LinearLayout myLayout = (LinearLayout) findViewById(R.id.myLinearLayout);
    

    4- 然后添加您的视图

    TextView tv = new TextView(this);
    tv.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT,
        LinearLayout.LayoutParams.FILL_PARENT));
    tv.setText("Trying Again");
    myLayout.addView(tv);
    

    我没有尝试,但这应该可以。

    你所犯的错误是

    1- SetContentView 方法覆盖内容视图中的所有视图。所以当你打电话时它会删除所有东西

    LinearLayout thisLayout = new LinearLayout(this);
    setContentView(thisLayout);
    

    2- 您在尝试查找时需要使用项目的 id。不是你在这里所做的布局文件的名称

    // findViewById gets the id of the view that you want to find
    LinearLayout myLayout = (LinearLayout) findViewById(R.layout.activity_main);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多