如何在Android中将TextView添加到LinearLayout


128

我试图TextViews在代码中添加到xml定义的布局中。我有一个xml工作表,其中Views定义了很多。但是我必须在代码中添加一些视图,因此LinearLayout在xml-sheet中创建一个:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:id="@+id/info"
android:layout_height="wrap_content" 
android:orientation="vertical">
</LinearLayout>

在这种布局中,我想添加我的TextView

    View linearLayout =  findViewById(R.id.info);
    //LinearLayout layout = (LinearLayout) findViewById(R.id.info);


    TextView valueTV = new TextView(this);
    valueTV.setText("hallo hallo");
    valueTV.setId(5);
    valueTV.setLayoutParams(new LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));

    ((LinearLayout) linearLayout).addView(valueTV);

但是我只收到以下错误消息:

: java.lang.ClassCastException: android.widget.TextView

我该怎么做?

感谢您的帮助。马丁


该例外适用于哪一行?它必须来自LinearLayout强制转换,您确定linearLayout变量是LinearLayout而不是TextView吗?另外,您不应该指定ID,因为无法保证ID是唯一的。
罗比·庞德

1
您是对的,linearLayout是TextView,但是为什么呢?我已经在xml文件中将其定义为LinearLayout ...
Martin 2010年

1
确保您确实在上面显示的xml上进行操作。setContentView(R.layout.your_xml_layout);真的是加载正确的xml吗?您还有其他使用XML布局的XML布局android:id="@+id/info"吗?
罗贾2011年

这个问题解决了吗?请接受作为答案或发表一个。
塔哈(Talha)

Answers:


105

尝试使用

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info);
...
linearLayout.addView(valueTV);

还请确保您正在创建的布局参数是LinearLayout.LayoutParams ...


再次有一个例外,因为findViewById返回一个TextView。但为什么?我使用LinearLayout id来获取它。
马丁2010年

为什么那会改变什么?它所做的所有操作都应尽快而不是稍后进行投射,这应该具有相同的效果。
yesennes '16

70

嘿,我已经检查过您的代码,您的代码没有严重错误。这是完整的代码:

main.xml:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:id="@+id/info"
android:layout_height="wrap_content" 
android:orientation="vertical">
</LinearLayout>

这是Stackoverflow.java

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Stackoverflow extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        View linearLayout =  findViewById(R.id.info);
        //LinearLayout layout = (LinearLayout) findViewById(R.id.info);

        TextView valueTV = new TextView(this);
        valueTV.setText("hallo hallo");
        valueTV.setId(5);
        valueTV.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));

        ((LinearLayout) linearLayout).addView(valueTV);
    }
}

复制此代码,然后运行它。这是完全没有错误的。照顾自己...


如果我想拥有以下TextView,该怎么办:<TextView android:id="@+id/tvDInfo3" android:layout_width="0dp" android:layout_height="wrap_content" android:textStyle="bold" android:text="Release Date" android:gravity="center" android:padding="@dimen/dyk_text_pad" android:textColor="#000000" android:textSize="@dimen/info_text_size" android:layout_weight="1" />
Si8 2013年

1
+1。这个答案比@Ben的答案要好得多,因为它包含一个LayoutParams以及如何TextView初始化其余属性的示例。这应该标记为答案。

3
注意:在2015年const FILL_PARENT已被弃用,您应该改用MATCH_PARENT。
Nikita Bosik

22

您可以TextView像这样通过编程将a添加到线性布局中:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);

什么是MyClass.this?我是Android开发的新手。我应该用我的片段类的名称代替“ MyClass”吗?
drusepth

1
MyClass.this是上下文,文本视图采用上下文
Mihai Bratulescu

2
为了澄清起见:MyClass.this在大多数情况下,与相同this。但是,如果您在嵌套类中并且要访问“外部”类的实例,则需要指定类的名称,这在为android中的事件定义回调时非常常见。
drigoangelo 2014年

我猜有些Android开发人员已经习惯于将类的名称放在需要的地方,并开始将其放置在任何地方。此外,MyClass.this是的实例MyClass,并且仅当MyClass实现Context(例如,扩展Activity)时
才是

20
for(int j=0;j<30;j++) {
    LinearLayout childLayout = new LinearLayout(MainActivity.this);
    LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT);
    childLayout.setLayoutParams(linearParams);

    TextView mType = new TextView(MainActivity.this);
    TextView mValue = new TextView(MainActivity.this);

    mType.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));
    mValue.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));

    mType.setTextSize(17);
    mType.setPadding(5, 3, 0, 3);
    mType.setTypeface(Typeface.DEFAULT_BOLD);
    mType.setGravity(Gravity.LEFT | Gravity.CENTER);

    mValue.setTextSize(16);
    mValue.setPadding(5, 3, 0, 3);
    mValue.setTypeface(null, Typeface.ITALIC);
    mValue.setGravity(Gravity.LEFT | Gravity.CENTER);

    mType.setText("111");
    mValue.setText("111");

    childLayout.addView(mValue, 0);
    childLayout.addView(mType, 0);

    linear.addView(childLayout);
}

10

您应该使用与此类似的方法将TextView动态添加到LinearLayout:

LinearLayout linearLayout = getActivity().findViewById(R.id.infoLayout);

TextView valueTV = new TextView(context);
valueTV.setText("hallo hallo");
valueTV.setId(Integer.parseInt("5"));
valueTV.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT,
       LinearLayout.LayoutParams.WRAP_CONTENT));

linearLayout.addView(valueTV);

getActivity()用于内部Fragments,对于每个内部实例,您都可以使用上下文或类似的东西。


3

您需要通过其布局资源而不是不能保证唯一的id资源访问布局。资源参考应类似于R.layout.my_cool_layout,其中上述XML布局存储在res / layout / my_cool_layout.xml中。


0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

-2

这是发生异常的地方

((LinearLayout) linearLayout).addView(valueTV);

addView方法接受类型的参数View,而不是TextView。因此,将valueTv对象显式转换为View对象。

因此,更正后的代码将是:

((LinearLayout) linearLayout).addView((TextView)valueTV);

你测试过了吗?
mrres1 2015年

是的,我有。而且效果很好!你试过了吗?
user3509153 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.