Как добавить TextView в LinearLayout в Android


129

Я пытаюсь добавить TextViewsв код свой XML-макет. У меня есть xml-лист, где много Viewsопределено. Но мне нужно добавить несколько представлений в код, поэтому создайте LinearLayoutв 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>

И в этот макет мне нравится добавлять 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);

Но я получаю только следующее сообщение об ошибке:

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

Как мне это сделать?

Спасибо за помощь. Мартин


Для какой строки это исключение? Это должно быть из приведения LinearLayout. Вы уверены, что переменная linearLayout является LinearLayout, а не TextView? Также вам не следует указывать идентификатор, поскольку вы не можете гарантировать, что он будет уникальным.
Робби Понд

1
Вы правы, linearLayout - это TextView, но почему? Я определил его в xml-файле как LinearLayout ...
Мартин

1
Убедитесь, что вы действительно работаете с XML, показанным выше. Действительно setContentView(R.layout.your_xml_layout);ли загружается правильный xml? Есть ли у вас другие макеты xml, в которых вы используете android:id="@+id/info"TextView?
Rodja 01

Эта проблема решена? Пожалуйста, примите в качестве ответа или отправьте его.
Talha

Ответы:


106

попробуйте использовать

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

также убедитесь, что создаваемые вами параметры макета - LinearLayout.LayoutParams ...


снова возникает исключение, потому что findViewById возвращает TextView. Но почему? Я получаю его с идентификатором LinearLayout .... что вы имеете в виду: также убедитесь, что параметры макета, которые вы создаете, являются LinearLayout.LayoutParams ... ???
Мартин

Почему это что-то изменит? Все, что он делает, кастуется раньше, чем позже, что должно иметь тот же эффект.
yesennes

70

Привет, я проверил ваш код, в нем нет серьезных ошибок. это полный код:

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>

это 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);
    }
}

скопируйте этот код и запустите его. это полностью безошибочно. Береги себя...


Что, если бы я хотел иметь следующий TextView:<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. Этот ответ намного лучше, чем у @Ben, поскольку он содержит пример LayoutParams и то, как TextViewинициализируются остальные свойства . Это должно быть отмечено как ответ.
Subby

3
Примечание: в 2015 году const FILL_PARENT устарела, вместо нее следует использовать MATCH_PARENT.
Никита Босик

22

Вы можете программно добавить TextViewв линейный макет следующим образом:

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

Что такое MyClass.this? Я новичок в разработке Android; я должен заменить имя моего класса фрагмента на "MyClass"?
drusepth

1
MyClass. Это контекст, и текстовое представление принимает контекст
Михай Братулеску

2
Просто для пояснения: MyClass.thisв большинстве случаев совпадает с this. Однако вам необходимо указать имя класса, если вы находитесь во вложенном классе и хотите получить доступ к экземпляру «внешнего» класса, что очень часто встречается при определении обратных вызовов для событий в android.
drigoangelo

Думаю, некоторые разработчики Android привыкли ставить имя класса там, где это нужно, и стали ставить его везде. Кроме того, MyClass.thisэто экземпляр MyClass, и он будет контекстом только в том случае, если MyClass реализует Context (например, расширяет активность)
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

Вы должны использовать что-то подобное для динамического добавления TextView в 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 () используется для внутренних фрагментов, вы можете использовать контекст или что-то подобное для каждого экземпляра, внутри которого вы находитесь.


3

Вам необходимо получить доступ к макету через его ресурс макета, а не ресурс идентификатора, уникальность которого не гарантируется. Ссылка на ресурс должна выглядеть как R.layout.my_cool_layout, где указанный выше макет XML хранится в res / layout / my_cool_layout.xml.


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

-2

Вот где возникает исключение

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

addViewМетод принимает параметр типа View, а не TextView. Следовательно, явно приведите тип объекта valueTv в объект View.

Следовательно, исправленный код будет:

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

Вы это проверяли?
mrres1

Да. И работает отлично! Ты это пробовал?
user3509153
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.