Проблемы с раздуванием составного компонента, который расширяет Layoutclass

Я пытаюсь расширить LinearLayout для использования в качестве составного компонента. Я следовал этому руководству: ссылка

Что кажется довольно прямолинейным. Однако, когда я пытаюсь раздуть свой компонент, он все время терпит неудачу. Ошибка, которую я получаю от logCat, заключается в том, что мой класс не может быть найден. Мне кажется странным, что, насколько я вижу, Android ищет мой компонент среди своих собственных компонентов (я не уверен в правильной формулировке здесь, см. Ниже).

Код, который я написал, выглядит следующим образом:

основная (текущая активность):

//just the ordinary autogenerated eclipse code...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

Мой расширенный линейный макет:

public class DialPadView extends LinearLayout {

public DialPadView(Context ctx, AttributeSet attr) {
    super(ctx, attr);
}


@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.dialpadview, this);
}

}

Мой файл макета 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"
>
<whalenut.testinflate.DialPadView
    android:id="@+id/mydialpad"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    /></LinearLayout>

и, наконец, мой файл dialpadview.xml для использования с составным компонентом:

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

конечно, все мои файлы классов находятся в пакете whalenut.testinflate

logCat говорит следующее:

java.lang.RuntimeException: невозможно запустить активность

...

Вызвано: android.view.InflateException: строка двоичного XML-файла № 2: ошибка при раздувании класса DialPadView

...

Вызвано: java.lang.ClassNotFoundException: android.view.DialPadView в загрузчике dalvik.system.PathClassLoader[/data/app/whalenut.testinflate-2.apk]

Почему Dalvik(?) ищет мой класс в пакете android.view вместо whalenut.testinflate, когда я указал полное имя класса в xml-файле, это потому, что он не находит его там с самого начала?

Короче почему я не могу, вернее как раздуть расширенный Layout в андроиде?


person Daniel Figueroa    schedule 10.08.2011    source источник


Ответы (1)


Вам нужно изменить DialPadView следующим образом:

<merge android:class="com.packageName.UIClassName"
    android:id="@+id/DialView"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<EditText android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="test"/>
</merge>

Затем вызовите это в своем конструкторе:

super(context, attrs, defStyle);

LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.DialView, this, true);

Затем вы можете использовать следующее в своей основной деятельности:

DialView myDialView = new DialView(context);

mainView.addView(myDialView);

Надеюсь, это поможет!

person Codeman    schedule 10.08.2011
comment
Спасибо Phoenixblade9, что решил мой вопрос. Однако вам не нужен атрибут android:class=... (eclipse его не примет). - person Daniel Figueroa; 11.08.2011
comment
Приятно это слышать! Рад, что смог помочь :) - person Codeman; 11.08.2011