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.