2010-07-15 10 views
14

Я создал свой собственный вид, создав подкласс класса SurfaceView.Пользовательский вид в макете xml

Однако я не могу понять, как добавить его из файла макета xml. Мой текущий файл main.xml выглядит так:

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

Что я пропустил?

Редактировать

Подробнее

мой взгляд выглядит следующим образом

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

И это прекрасно работает так:

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

Но ничего не происходит при попытке использовать его из xml.

ответ

17

Вы хотите:

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

После просмотра остальной части кода это, вероятно, бросать, потому что вы не можете вызвать getHolder в конструкторе, а завышены. Переместить, что View#onFinishInflate

Итак:

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

Если это не работает, попробуйте положить, что в функции инициализации, которую вы называете в Activity сек OnCreate вашей после setContentView.

Возможно, это было раньше, потому что при раздувании из xml строится конструктор: View(Context, AttributeSet) вместо View(Context).

+0

С моим первым layoutI только что получил черный экран, с этим приложение падает. – monoceres

+0

Какова была трассировка стека? – Qberticus

+0

http://pastebin.com/u2t3jdMt – monoceres

11

Что вы пропустили в своем примере, было имя тега, оно должно быть «представлением» (первым не-капиталом), а не «представлением». Хотя вы можете поместить свое имя класса в качестве имени тега большую часть времени, это невозможно сделать, если ваш класс является внутренним классом, потому что символ «$», который используется в Java для ссылки на внутренние классы, ограничен в тегах XML. Итак, если вы хотите использовать внутренний класс в вашем XML, вы должны написать так:

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

Дело в том, что оба «вид» и «View» теги существуют в схеме. «Показать» тег (начинающийся с заглавной буквы) будет генерировать класс вида, а «view» тег при анализе рассмотрит атрибут класса.

+1

OMG Я люблю тебя, человек (строго неплатоническим способом)! – samosaris

+0

@SamusArin +1 для его любви haha ​​ –

+0

Не забудьте добавить ВСЕ конструкторы. Если вы переопределяете View, есть 3 конструктора: View (контекст контекста), View (контекст контекста, AttributeSet attrs) и View (контекст контекста, AttributeSet attrs, int defStyleAttr) – SoloPilot

Смежные вопросы