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


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


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


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

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

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.


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.


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

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

Sudahkah Anda menguji ini?
mrres1

Ya saya punya. Dan itu bekerja dengan sempurna! Sudahkah Anda mencobanya?
user3509153
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.