Bagaimana cara menambahkan TextView ke LinearLayout di Android

129

Saya mencoba menambahkan TextViewstata letak yang ditentukan xml dalam kode. Saya memiliki lembar xml, di mana banyak Viewsdidefinisikan. Tapi saya harus menambahkan beberapa tampilan dalam kode, jadi buat LinearLayoutdi lembar xml:

<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>

Dan dalam tata letak ini, saya ingin menambahkan 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);

Tapi saya hanya mendapatkan pesan kesalahan berikut:

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

Bagaimana saya bisa melakukannya?

Terima kasih atas bantuannya. Martin

Martin
sumber
Baris mana untuk pengecualian itu? Itu harus dari pemain LinearLayout, apakah Anda yakin variabel linearLayout adalah LinearLayout dan bukan TextView? Anda juga tidak boleh menentukan ID karena Anda tidak dapat menjamin itu unik.
Robby Pond
1
Anda benar, linearLayout adalah TextView, tetapi mengapa? Saya telah mendefinisikannya dalam file xml sebagai LinearLayout ...
Martin
1
Pastikan Anda benar-benar beroperasi pada xml yang ditunjukkan di atas. Apakah setContentView(R.layout.your_xml_layout);benar-benar memuat xml yang tepat? Apakah Anda memiliki tata letak xml lain di mana Anda menggunakan android:id="@+id/info"yang kebetulan merupakan TextView?
Rodja
Apakah masalah ini teratasi? Silakan terima sebagai jawaban atau posting satu.
Talha

Jawaban:

106

coba gunakan

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

juga pastikan bahwa tata letak param yang Anda buat adalah LinearLayout.LayoutParams ...

Ben
sumber
ada lagi pengecualian, karena findViewById mengembalikan TextView. Tapi kenapa? Saya mengambilnya dengan id LinearLayout .... apa maksud Anda dengan: juga pastikan bahwa tata letak param yang Anda buat adalah LinearLayout.LayoutParams ... ???
Martin
Mengapa itu mengubah apa pun? Semua yang dilakukannya dilemparkan lebih cepat daripada nanti, yang seharusnya memiliki efek yang sama.
yesennes
70

Hai, saya sudah memeriksa kode Anda, tidak ada kesalahan serius dalam kode Anda. ini adalah kode lengkap:

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>

ini adalah 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);
    }
}

salin kode ini, dan jalankan. itu sepenuhnya bebas dari kesalahan. hati hati...

Pushpendra Kuntal
sumber
Bagaimana jika saya ingin memiliki TextView berikut:<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. Jawaban ini jauh lebih baik daripada @ Ben karena berisi contoh LayoutParams dan bagaimana sisa properti TextViewdiinisialisasi. Ini harus ditandai sebagai jawaban.
Subby
3
Catatan: pada 2015 const FILL_PARENT sudah ditinggalkan, Anda harus menggunakan MATCH_PARENT sebagai gantinya.
Nikita Bosik
22

Anda dapat menambahkan TextViewtata letak linier secara terprogram seperti ini:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);
Deepak
sumber
Apa itu MyClass.ini? Saya baru mengenal pengembangan Android; Apakah saya harus mengganti nama kelas fragmen saya dengan "MyClass"?
drusepth
1
MyClass.ini adalah konteks dan tampilan teks mengambil konteks
Mihai Bratulescu
2
Hanya untuk klarifikasi:, MyClass.thisdalam banyak kasus, sama dengan this. Anda perlu menentukan, bagaimanapun, nama kelas, jika Anda berada di kelas bersarang dan ingin mengakses instance dari kelas "luar", yang sangat umum ketika menentukan panggilan balik untuk acara di android.
drigoangelo
Saya kira beberapa pengembang android terbiasa meletakkan nama kelas di tempat yang diperlukan dan mulai meletakkannya di mana-mana. Juga, MyClass.thisadalah turunan dari MyClass, dan itu hanya akan menjadi konteks jika MyClass mengimplementasikan Konteks (misalnya memperluas Aktivitas)
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);
}
vaibhav jain
sumber
10

Anda harus menggunakan sesuatu yang mirip dengan ini untuk menambahkan TextView ke LinearLayout secara dinamis:

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 () digunakan untuk di dalam Fragmen, Anda dapat menggunakan konteks atau hal serupa lainnya di setiap instance yang ada di dalam.

Noir
sumber
3

Anda perlu mengakses tata letak melalui sumber daya tata letaknya, bukan sumber daya id yang tidak dijamin unik. Referensi sumber daya akan terlihat seperti R.layout.my_cool_layout tempat tata letak XML di atas disimpan dalam res / layout / my_cool_layout.xml.

penguin359
sumber
0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Zapnologica
sumber
-2

Di sinilah pengecualian terjadi

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

addViewMetode mengambil parameter tipe View, bukan TextView. Oleh karena itu, ketikkan objek valueTv ke objek Tampilan, secara eksplisit.

Karenanya, kode yang diperbaiki adalah:

((LinearLayout) linearLayout).addView((TextView)valueTV);
pengguna3509153
sumber
Sudahkah Anda menguji ini?
mrres1
Ya saya punya. Dan itu bekerja dengan sempurna! Sudahkah Anda mencobanya?
user3509153