Проблемы с накачиванием составного компонента, расширяющего класс Layout - PullRequest
2 голосов
/ 10 августа 2011

Это мой первый вопрос, насколько я помню, поэтому, пожалуйста, держите меня в покое, если я пропустил подобный вопрос, на который был дан ответ.

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

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

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

main (текущая деятельность):

//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: Невозможно запустить действие. ComponentInfo {whalenut.testinflate / whalenut.testinflate.TestInflateActivity}: android.view.InflateException: строка двоичного XML-файла # 2: Ошибка надувания класса DialPadView

...

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

...

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

Пожалуйста, если вы, ребята, можете помочь мне понять, почему Далвик (?) Ищет мой класс в пакете android.view вместо whalenut.testinflate , когда я дал полностью квалифицированное имя класса в xml-файле, потому что он не находит там для начала?

Надеюсь, я был достаточно ясен в своем обращении. Короче говоря, почему я не могу, или, вернее, как накачать расширенный макет в Android?

1 Ответ

1 голос
/ 10 августа 2011

Вам нужно изменить свой 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);

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

...