2012-08-24 10 views
7

Tôi cảm thấy như thể tôi đã từng biết làm thế nào để làm điều này, nhưng tôi hiện đang vẽ một khoảng trống. Tôi có một lớp mở rộng từ View (Card) và tôi đã viết một bố cục cho nó trong XML. Những gì tôi muốn làm là đặt Chế độ xem của Card làm Chế độ xem XML trong hàm tạo, vì vậy tôi có thể sử dụng các phương thức trong Card để đặt TextView và không có gì. Bất kỳ đề xuất? Mã bên dưới:Sử dụng bố cục XML làm chế độ xem cho lớp con Xem?

Card.java: (Tôi có View.inflate(context, R.layout.card_layout, null); làm ví dụ về những gì tôi muốn làm, nhưng nó không hoạt động. Về cơ bản tôi muốn lớp đó là giao diện cho Chế độ xem và để làm rằng tôi cần phải bằng cách nào đó gán layout XML để View. tôi sử dụng một cái gì đó dọc theo dòng của setContentView(View view)? không có phương pháp như vậy trong lớp View, nhưng có cái gì giống như nó?)

public class Card extends View { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

card_layout. xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    android:layout_gravity="center" 
    android:background="@drawable/card_bg" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/tv" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:textSize="24dp" 
    /> 

</LinearLayout> 

Trả lời

10

Những gì bạn đang cố gắng làm là không thể với các thiết lập hiện tại. A View (hoặc một phân lớp trực tiếp của nó) đại diện cho đơn xem nó không có khái niệm về quan điểm của trẻ, những gì bạn đang cố gắng làm. Không thể sử dụng LayoutInflater với một đơn giản View vì lớp đơn giản View không có phương pháp để thực sự thêm trẻ vào đó (như phương thức addView()).

Mặt khác, lớp đúng để sử dụng để có thể có con là ViewGroup (hoặc một trong các lớp con trực tiếp như LinearLayout, FrameLayout vv) mà chấp nhận thêm Views hoặc ViewGroups khác với nó, bằng cách cung cấp các addView phương pháp. Cuối cùng lớp học của bạn nên là:

public class Card extends ViewGroup { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

Nếu tôi nhớ lại bạn phải ghi đè onLayout nếu bạn mở rộng ViewGroup, vì vậy thay vì (và vì file layout của bạn), bạn nên xem xét mở rộng LinearLayout và thay thế LinearLayout từ bố cục xml với thẻ merge.

+0

Tôi nghĩ về việc chỉ mở lớp 'LinearLayout' và sau đó nghĩ rằng đó là một ý tưởng ngớ ngẩn.Tôi đã thử nó sau khi nhìn thấy bình luận này và nó đã làm việc hoàn hảo! Cảm ơn nhiều! – roboguy12

3

Bạn sẽ có thể sử dụng tên lớp của mình trong bố cục. Một cái gì đó như:

<your.package.name.Card 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    ... 

Chỉ cần gọi findViewById để xem con.

Để sử dụng lớp Thẻ của bạn, bạn sử dụng inflator để lấy một cá thể, sau đó đính kèm nó vào chế độ xem gốc.

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
Card card = (Card) inflater.inflate(R.layout.card_layout, null); 
parentView.addView(card); 

Have a look at the docs for more info.

+0

Nhưng cách 'card_layout.xml' được kết nối với lớp' Thẻ'? Khi tôi làm những gì bạn đã viết ở trên, không có gì xuất hiện. – roboguy12

+0

Tôi đã xem các tài liệu và nó cung cấp nhiều thông tin về lập trình vẽ một khung nhìn tùy chỉnh nhưng không có gì về việc sử dụng một định nghĩa trong XML. Tôi có thể vẽ tất cả mọi thứ bằng cách sử dụng các phương pháp và như vậy, nhưng nó sẽ mất một thời gian, vì nó là một bố cục khá chi tiết. – roboguy12

+0

Bạn sẽ cần thêm một thể hiện 'Thẻ' vào một chế độ xem khác mà bạn đang sử dụng với' view.addView (thẻ) 'hoặc với' setContentView (thẻ) 'cho một hoạt động. – devnate