Jak dodać TextView do LinearLayout w systemie Android


128

Próbuję dodać TextViewsdo mojego układu zdefiniowanego w XML w kodzie. Mam arkusz xml, w którym wiele Viewsjest zdefiniowanych. Ale muszę dodać kilka widoków w kodzie, więc stwórzmy LinearLayoutw arkuszu 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>

W tym układzie lubię dodać moje 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);

Ale pojawia się tylko następujący komunikat o błędzie:

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

Jak mogę to zrobić?

Dzięki za pomoc. Jaskółka oknówka


Dla której linii jest to wyjątek? Musi pochodzić z rzutowania LinearLayout. Czy na pewno zmienna linearLayout jest LinearLayout, a nie TextView? Nie powinieneś też podawać identyfikatora, ponieważ nie możesz zagwarantować, że będzie unikalny.
— Robby Pond,

1
Masz rację, linearLayout to TextView, ale dlaczego? Zdefiniowałem go w pliku xml jako LinearLayout ...
— Martin,

1
Upewnij się, że naprawdę pracujesz na XML pokazanym powyżej. Czy setContentView(R.layout.your_xml_layout);naprawdę ładuje właściwy plik XML? Czy masz inne układy XML, w których używasz, android:id="@+id/info"które okazały się być TextView?
— Rodja

Czy ten problem został rozwiązany? Prosimy o akceptację jako odpowiedź lub opublikowanie jej.
— Talha

Odpowiedzi:


105

spróbuj użyć

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

upewnij się również, że tworzone parametry układu to LinearLayout.LayoutParams ...


znowu występuje wyjątek, ponieważ findViewById zwraca TextView. Ale dlaczego? Pobieram go z identyfikatorem LinearLayout .... co masz na myśli przez: upewnij się również, że parametry układu, które tworzysz, to LinearLayout.LayoutParams ... ???
— Martin

Dlaczego miałoby to coś zmieniać? Wszystko, co robi, to raczej prędzej niż później, co powinno przynieść ten sam efekt.
— takennes

70

Hej, sprawdziłem twój kod, nie ma poważnego błędu w twoim kodzie. to jest pełny kod:

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>

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

skopiuj ten kod i uruchom go. jest całkowicie wolny od błędów. dbać...


A co gdybym chciał mieć następujący <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" />
— TextView

1
+1. Ta odpowiedź jest znacznie lepsza niż @ Ben's, ponieważ zawiera przykład LayoutParams i sposób TextViewinicjalizacji pozostałych właściwości . Powinno to zostać oznaczone jako odpowiedź.
— Subby

3
Uwaga: w 2015 const FILL_PARENT jest przestarzałe, powinieneś zamiast tego użyć MATCH_PARENT.
— Nikita Bosik

22

Możesz dodać a TextViewdo swojego układu liniowego programowo w następujący sposób:

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

Co to jest MyClass.this? Jestem nowy w programowaniu na Androida; czy mam zastąpić nazwę mojej klasy fragmentów zamiast „MyClass”?
— drusepth

1
MyClass. To jest kontekst, a widok tekstu przyjmuje kontekst
— Mihai Bratulescu

2
Dla wyjaśnienia: MyClass.thisw większości przypadków jest taki sam jak this. Musisz jednak podać nazwę klasy, jeśli jesteś w klasie zagnieżdżonej i chcesz uzyskać dostęp do instancji klasy „zewnętrznej”, co jest bardzo częste podczas definiowania wywołań zwrotnych dla zdarzeń w systemie Android.
— drigoangelo

Wydaje mi się, że niektórzy programiści Androida przyzwyczaili się do umieszczania nazwy klasy tam, gdzie jest potrzebna, i zaczęli umieszczać ją wszędzie. Ponadto, MyClass.thisjest to przypadek MyClass, i to tylko jeśli kontekst narzędzia MojaKlasa kontekstem (np rozciąga aktywności)
— 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

Powinieneś użyć czegoś podobnego do tego, aby dynamicznie dodawać TextView do 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 () jest używana dla wewnętrznych fragmentów, możesz użyć kontekstu lub czegoś podobnego dla każdej instancji, w której się znajdujesz.


3

Musisz uzyskać dostęp do układu za pośrednictwem jego zasobu układu, a nie zasobu id, który nie jest gwarantowany jako unikalny. Odwołanie do zasobu powinno wyglądać jak R.layout.my_cool_layout, gdzie powyższy układ XML jest przechowywany w res / layout / my_cool_layout.xml.


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

-2

Oto, gdzie występuje wyjątek

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

addViewmetoda przyjmuje parametr typu View, a nie TextView. W związku z tym należy jawnie typecast obiektu valueTv do obiektu View.

Dlatego poprawiony kod wyglądałby tak:

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

Czy to przetestowałeś?
— mrres1

Tak, mam. I działa idealnie! Próbowałeś tego?
— user3509153
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.