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

Jaskółka oknówka
źródło
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 ...

Ben
źródło
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ć...

Pushpendra Kuntal
źródło
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);
Deepak
źródło
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);
}
vaibhav jain
źródło
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.

Noir
źródło
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.

penguin359
źródło
0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Zapnologica
źródło
-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);
user3509153
źródło
Czy to przetestowałeś?
mrres1
Tak, mam. I działa idealnie! Próbowałeś tego?
user3509153