2010-12-14 40 views
7

Tôi muốn tạo một tùy chỉnh View trên Android. Tôi đã cố gắng làm điều đó đơn giản nhất có thể và tạo ra một lớp học gần như trống rỗng MyView và sử dụng nó trong LinearLayout của tôi nhưng ứng dụng không thành công khi bắt đầu với "Force Close". Làm thế nào tôi có thể làm một đơn giản tùy chỉnh View? Theo số Building Custom Components, số View nhận kích thước 100x100 nếu tôi không ghi đè onMeasure().Cách tạo Chế độ xem tùy chỉnh đơn giản?

public class MyView extends View { 

    public MyView(Context context) { 
     super(context); 
    } 
} 

Và tôi sử dụng nó trong một LinearLayout với:

<view 
    class="com.example.MyView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" /> 

Tôi đang làm gì sai?


Nếu tôi sử dụng hàm tạo itemon đề xuất và gọi hàm tương ứng với siêu lớp. Sau đó, "Force Close" đã biến mất, nhưng LinearLayout của tôi bị hỏng, các thành phần sau MyView không được hiển thị.

Đây là tôi main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
    android:background="#f00" 
    android:text="Hello" 
/> 
<view 
    class="com.example.MyView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
/> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
    android:background="#00f" 
    android:text="World" 
/> 
</LinearLayout> 
+0

Bạn có thể tham khảo mẫu tốt tại đây: [http://www.sgoliver.net/blog/?p=1457](http://www.sgoliver.net/blog/?p=1457) –

+0

Tôi có tương tự nhu cầu .. có bạn có những gì bạn cần. .share một số mã plz – Nepster

Trả lời

9

có thể bạn có thể định nghĩa một phương pháp xây dựng như thế này:

public MyView(Context context, AttributeSet attrs) 

khuôn khổ android sẽ cố gắng để xây dựng giao diện người dùng với quan điểm của bạn từ các nhà xây dựng trên .

+0

Cảm ơn, đó là loại bỏ thông báo "Force Close", nhưng 'LinearLayout' của tôi bị hỏng, thành phần sau khi không được hiển thị. – Jonas

+2

Tôi cũng phải ghi đè lên 'onMeasure()'. Bây giờ nó hoạt động tuyệt vời. – Jonas

9

Hướng dẫn dành cho nhà phát triển Android có một phần được gọi là Xây dựng các thành phần tùy chỉnh. Thật không may, việc thảo luận các thuộc tính XML chỉ bao gồm việc khai báo điều khiển bên trong tệp sơ đồ bố trí và không thực sự xử lý các giá trị bên trong khởi tạo lớp. Các bước thực hiện như sau:

Declare thuộc tính trong giá trị \ attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyCustomView"> 
     <attr name="android:text"/> 
     <attr name="android:textColor"/>    
     <attr name="extraInformation" format="string" /> 
    </declare-styleable> 
</resources> 

Thông báo việc sử dụng một cái tên không đủ tiêu chuẩn trong thẻ khai báo-styleable. Thuộc tính android không chuẩn như extraInformation cần phải khai báo kiểu của chúng. Các thẻ được khai báo trong lớp cha sẽ có sẵn trong các lớp con mà không cần phải được redeclared.

Tạo constructors

Vì có hai nhà xây dựng có sử dụng một AttributeSet cho khởi động, nó là thuận tiện để tạo ra một phương pháp khởi động riêng biệt cho các nhà thầu để gọi.

private void init(AttributeSet attrs){ 
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView); 
    //Use a 
    Log.i("test",a.getString(R.styleable.MyCustomView_android_text)); 
    Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK)); 
    Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation)); 
    //Don't forget this 
    a.recycle(); 
} 

R.styleable.MyCustomView là tài nguyên int autogenerated trong đó mỗi phần tử là ID của thuộc tính. Các thuộc tính được tạo cho mỗi thuộc tính trong XML bằng cách gắn thêm tên thuộc tính vào tên phần tử. Các thuộc tính sau đó có thể được lấy ra từ TypedArray bằng cách sử dụng các hàm get khác nhau. Nếu thuộc tính không được định nghĩa trong XML, thì null được trả về. Ngoại trừ, tất nhiên, nếu kiểu trả về là nguyên thủy, trong trường hợp đó đối số thứ hai được trả về.

Nếu bạn không muốn truy xuất tất cả thuộc tính, có thể tạo mảng này theo cách thủ công. ID cho thuộc tính android chuẩn được bao gồm trong android.R.attr, trong khi thuộc tính cho dự án này nằm trong R. attr.

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor}; 

Xin lưu ý rằng bạn không nên sử dụng bất kỳ thứ gì trong android.R.styleable, theo chủ đề này, nó có thể thay đổi trong tương lai. Nó vẫn còn trong tài liệu như là để xem tất cả các hằng số ở một nơi là hữu ích.

Sử dụng nó trong một file bố trí như bố trí \ main.xml Bao gồm việc khai báo namespace

xmlns: Ứng dụng = "http://schemas.android.com/apk/res/com.mycompany .projectname "

trong phần tử xml cấp cao nhất.

<com.mycompany.projectname.MyCustomView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/transparent" 
    android:text="Test text" 
    android:textColor="#FFFFFF" 
app:extraInformation="My extra information"; 
/> 

Tham chiếu chế độ xem tùy chỉnh bằng cách sử dụng tên đầy đủ.

Android LabelView mẫu

Nếu bạn muốn có một ví dụ hoàn chỉnh, nhìn vào mẫu xem nhãn android.

LabelView.java

TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView); 
CharSequences=a.getString(R.styleable.LabelView_text); 
attrs.xml 

<declare-styleable name="LabelView"> 
    <attr name="text"format="string"/> 
    <attr name="textColor"format="color"/> 
    <attr name="textSize"format="dimension"/> 
</declare-styleable> 

custom_view_1.xml

<com.example.android.apis.view.LabelView 
    android:background="@drawable/blue" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:text="Blue"app:textSize="20dp"/> 

này được chứa trong một LinearLayout với một thuộc tính namespace:

xmlns: Ứng dụng = "http: // schemas.android.com/apk/res/com.example.android.apis "

Các vấn đề liên quan