AndroidでLinearViewにTextViewを追加する方法


128

TextViewsコードでxml定義のレイアウトに追加しようとしています。多くのViewsものが定義されているxml-sheetがあります。しかし、コードにいくつかのビューを追加する必要があるため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を指定しないでください。
Robby Pond

1
そうです、linearLayoutはTextViewですが、なぜですか?xml-fileでLinearLayoutとして定義しました...
Martin

1
上記のxmlを実際に操作していることを確認してください。されてsetContentView(R.layout.your_xml_layout);本当に正しいXMLをロードしますか?あなたがandroid:id="@+id/info"たまたまTextView を使用している他のxmlレイアウトはありますか?
Rodja、2011

この問題は解決しましたか?回答として受け入れるか、投稿してください。
Talha 2016年

回答:


105

使ってみる

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

また、作成するレイアウトパラメータがLinearLayout.LayoutParams ...であることを確認してください。


findViewByIdがTextViewを返すため、ここでも例外があります。しかし、なぜ?私はそれをLinearLayout IDでフェッチします...どういう意味ですか:また、作成しているレイアウトパラメータがLinearLayout.LayoutParamsであることを確認してください... ???
マーティン、

なぜそれが何かを変えるのでしょうか?それが行うことはすべて、後でではなく早くキャストされ、同じ効果を持つはずです。
yesennes 2016年

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

1
+1。この答えは、LayoutParamsの例と残りのプロパティのTextView初期化方法が含まれているため、@ Benの答えよりもはるかに優れています。これは回答としてマークする必要があります。
Subby 2014年

3
注:2015ではconst FILL_PARENTは非推奨になりました。代わりにMATCH_PARENTを使用してください。
Nikita Bosik 2015

22

TextView次のようにプログラムで線形レイアウトにを追加できます。

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 2012

1
MyClass.thisはコンテキストであり、テキストビューはコンテキストを取り込みます
Mihai Bratulescu 2013

2
明確にするためMyClass.thisに、ほとんどの場合、はと同じthisです。ただし、ネストされたクラスで「外部」クラスのインスタンスにアクセスする場合は、クラスの名前を指定する必要があります。これは、androidでイベントのコールバックを定義するときに非常に一般的です。
drigoangelo 2014年

一部のAndroid開発者は、クラスの名前を必要な場所に配置することに慣れ、どこにでも配置し始めたと思います。また、MyClass.thisのインスタンスでありMyClass、MyClassがコンテキストを実装する場合(たとえば、Activityを拡張する場合)にのみコンテキストになります
drigoangelo

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リソースではなく、レイアウトリソースを介してレイアウトにアクセスする必要があります。リソース参照は、上記のXMLレイアウトがres / layout / my_cool_layout.xmlに格納されているR.layout.my_cool_layoutのようになります。


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年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.