2010-07-15 49 views
14

Tôi đã tạo chế độ xem của riêng mình bằng cách tạo một lớp con của lớp SurfaceView.Chế độ xem tùy chỉnh trong bố cục xml

Tuy nhiên tôi không thể tìm ra cách thêm từ tệp bố cục xml. Tệp main.xml hiện tại của tôi trông giống như sau:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

<View 
    class="com.chainparticles.ChainView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 


</LinearLayout> 

Tôi đã bỏ lỡ điều gì?

Sửa

Thông tin thêm

Quan điểm của tôi trông như thế này

package com.chainparticles; 
public class ChainView extends SurfaceView implements SurfaceHolder.Callback { 
    public ChainView(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
    } 
// Other stuff 
} 

Và nó hoạt động tốt như thế này:

ChainView cview = new ChainView(this); 
setContentView(cview); 

Nhưng không có gì xảy ra khi cố gắng sử dụng nó từ xml.

Trả lời

17

Bạn muốn:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
> 

    <com.chainparticles.ChainView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

Edit:

Sau khi nhìn thấy phần còn lại của mã của bạn nó có thể ném bởi vì bạn không thể gọi getHolder trong các nhà xây dựng trong khi bị thổi phồng. Di chuyển đến View#onFinishInflate

Vì vậy:

@Override 
protected void onFinishInflate() { 
    getHolder().addCallback(this); 
} 

Nếu điều đó không làm việc cố gắng đưa rằng trong một hàm init mà bạn gọi bạn Activity s onCreate sau setContentView.

Có thể nó đã hoạt động trước vì khi tăng từ xml, hàm tạo: View(Context, AttributeSet) được gọi thay vì View(Context).

+0

Với bố cục đầu tiên của tôi, tôi vừa mới nhận được một màn hình màu đen, thay vào đó ứng dụng này gặp sự cố. – monoceres

+0

dấu vết ngăn xếp là gì? – Qberticus

+0

http://pastebin.com/u2t3jdMt – monoceres

11

Những gì bạn bỏ lỡ trong ví dụ của mình là tên thẻ, nó được coi là "chế độ xem" (không phải là vốn đầu tiên) chứ không phải "Chế độ xem". Mặc dù bạn có thể đặt tên lớp của bạn làm tên thẻ hầu hết thời gian, nhưng không thể làm điều đó nếu lớp của bạn là lớp bên trong, vì biểu tượng "$", được sử dụng trong Java để tham chiếu các lớp bên trong bị hạn chế trong các thẻ XML. Vì vậy, nếu bạn muốn sử dụng lớp bên trong XML của bạn, bạn nên viết như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
> 

    <view 
     class="com.chainparticles.Foo$InnerClassChainView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

Cái này là cả hai "xem" và "Xem" thẻ tồn tại trong lược đồ. Thẻ "Xem" (bắt đầu bằng chữ cái viết hoa) sẽ tạo lớp Chế độ xem trong khi thẻ "xem" khi được phân tích cú pháp sẽ kiểm tra thuộc tính lớp.

+1

OMG Tôi yêu bạn người đàn ông (theo cách không nghiêm túc)! – samosaris

+0

@SamusArin +1 để yêu anh ấy haha ​​ –

+0

Hãy nhớ thêm tất cả các hàm tạo. Nếu bạn đang ghi đè Xem, có 3 hàm tạo: Chế độ xem (Ngữ cảnh bối cảnh), Chế độ xem (Ngữ cảnh bối cảnh, AttributeSet attrs) và Chế độ xem (Ngữ cảnh bối cảnh, AttributeSet attrs, int defStyleAttr) – SoloPilot

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