Як додати TextView до LinearLayout в Android


128

Я намагаюсь додати 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? Крім того, ви не повинні вказувати Id, оскільки ви не можете гарантувати, що він буде унікальним.
Robby Pond

1
Ви маєте рацію, linearLayout - це TextView, але чому? Я визначив це у xml-файлі як LinearLayout ...
Мартін

1
Переконайтеся, що ви дійсно працюєте на зображенні xml, показаному вище. Є чи на setContentView(R.layout.your_xml_layout);самому справі завантажується правильний XML? Чи є у вас інші макети xml, де ви використовуєте android:id="@+id/info"TextView?
Роджа

Чи вирішено це питання? Будь ласка, прийміть як відповідь або опублікуйте.
Талха

Відповіді:


105

спробуйте використовувати

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"?
друзепт

1
MyClass.this - це контекст, і перегляд тексту займає контекст
Mihai Bratulescu,

2
Просто для уточнення: MyClass.thisу більшості випадків це те саме, що this. Однак вам потрібно вказати назву класу, якщо ви перебуваєте в вкладеному класі і хочете отримати доступ до екземпляра "зовнішнього" класу, що дуже часто зустрічається при визначенні зворотних викликів для подій в android.
drigoangelo

Напевно, деякі розробники андроїдів звикли ставити назву класу там, де це потрібно, і почали ставити його скрізь. Крім того, MyClass.thisце примірник MyClass, і це буде лише контекст, якщо MyClass реалізує контекст (наприклад, розширює Activity)
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.