Cách thêm TextView vào linearLayout trong Android


128

Tôi đang cố gắng thêm TextViewsvào bố cục xml do mã xác định. Tôi có một tờ xml, trong đó có rất nhiều Viewsđịnh nghĩa. Nhưng tôi phải thêm một số khung nhìn trong mã, vì vậy hãy tạo một LinearLayouttrong xml-sheet:

<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>

Và trong bố cục này, tôi muốn thêm 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);

Nhưng tôi chỉ nhận được thông báo lỗi sau:

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

Tôi làm nó như thế nào?

Cảm ơn sự giúp đỡ của bạn. Martin


Dòng nào là ngoại lệ cho? Nó phải là từ dàn diễn viên linearLayout, bạn có chắc là biến linearLayout là một linearLayout chứ không phải là TextView không? Ngoài ra, bạn không nên chỉ định Id vì bạn không thể đảm bảo nó sẽ là duy nhất.
Robby Pond

1
Bạn nói đúng, linearLayout là một TextView, nhưng tại sao? Tôi đã định nghĩa nó trong tệp xml dưới dạng linearLayout ...
Martin

1
Hãy chắc chắn rằng bạn đang thực sự hoạt động trên xml được hiển thị ở trên. Là setContentView(R.layout.your_xml_layout);thực sự tải đúng xml? Bạn có bố trí xml khác nơi bạn sử dụng android:id="@+id/info"là TextView không?
Rodja

Vấn đề này đã được giải quyết chưa? Vui lòng chấp nhận như câu trả lời hoặc đăng một.
Talha

Câu trả lời:


105

thử sử dụng

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

cũng đảm bảo rằng các thông số bố cục bạn đang tạo là linearLayout.LayoutParams ...


lại có một ngoại lệ, bởi vì findViewById trả về một TextView. Nhưng tại sao? Tôi tìm nạp nó với id linearLayout .... bạn có ý gì với: cũng đảm bảo rằng các thông số bố cục bạn đang tạo là linearLayout.LayoutParams ... ???
Martin

Tại sao điều đó sẽ thay đổi bất cứ điều gì? Tất cả những gì nó làm được đúc sớm hơn là muộn hơn, sẽ có tác dụng tương tự.
yesennes

70

Xin chào, tôi đã kiểm tra mã của bạn, không có lỗi nghiêm trọng trong mã của bạn. đây là mã hoàn chỉnh:

tệp chính: -

<?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>

đây là 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);
    }
}

sao chép mã này và chạy nó nó hoàn toàn không có lỗi bảo trọng...


Điều gì xảy ra nếu tôi muốn có TextView sau:<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. Câu trả lời này tốt hơn nhiều so với @ Ben vì nó chứa một ví dụ về LayoutParams và cách phần còn lại của các thuộc tính của phần TextViewkhởi tạo. Điều này nên được đánh dấu là một câu trả lời.
Subby

3
Lưu ý: trong năm 2015 const FILL_PARENT không được dùng nữa, bạn nên sử dụng MATCH_PARENT thay thế.
Nikita Bosik

22

Bạn có thể thêm một TextViewvào bố cục tuyến tính của mình theo chương trình như thế này:

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

MyClass.this là gì? Tôi mới phát triển Android; Tôi có nên thay thế tên của lớp phân đoạn của tôi trong "MyClass" không?
drusepth

1
MyClass.this là một bối cảnh và chế độ xem văn bản sẽ có trong một bối cảnh
Mihai Bratulescu

2
Chỉ cần làm rõ : MyClass.this, trong hầu hết các trường hợp, giống như this. Tuy nhiên, bạn cần chỉ định tên của lớp, nếu bạn đang ở trong một lớp lồng nhau và muốn truy cập vào thể hiện của lớp "bên ngoài", điều này rất phổ biến khi xác định các cuộc gọi lại cho các sự kiện trong Android.
drigoangelo

Tôi đoán một số nhà phát triển Android đã quen với việc đặt tên của lớp mà nó cần và bắt đầu đặt nó ở mọi nơi. Ngoài ra, MyClass.thislà một ví dụ MyClassvà sẽ chỉ là một bối cảnh nếu MyClass triển khai Bối cảnh (ví dụ: mở rộng Hoạt động)
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

Bạn nên sử dụng một cái gì đó tương tự như thế này để thêm TextView vào linearLayout một cách linh hoạt:

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 () được sử dụng cho bên trong Fragment, bạn có thể sử dụng bối cảnh hoặc bất cứ thứ gì tương tự cho mỗi phiên bản bạn đang ở trong đó.


3

Bạn cần truy cập vào bố cục thông qua tài nguyên bố cục của nó, không phải là tài nguyên id không được đảm bảo duy nhất. Tham chiếu tài nguyên sẽ trông giống như R.layout.my_cool_layout nơi bố cục XML ở trên của bạn được lưu trữ trong res / layout / my_cool_layout.xml.


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

-2

Đây là nơi xảy ra ngoại lệ

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

addViewphương thức có trong một tham số của loại View, không TextView. Do đó, typecast đối tượng valueTv thành một đối tượng View, rõ ràng.

Do đó, mã được sửa sẽ là:

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

Bạn đã thử nghiệm điều này?
mrres1

Vâng tôi có. Và nó hoạt động hoàn hảo! Bạn đã thử chưa?
dùng3509153
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.