Ответ 1
Для внутренних классов синтаксис будет выглядеть следующим образом:
<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />
Причина в том, что $является незаконным символом в тегах XML.
Хмм...
Я создаю подкласс представления как внутренний класс в моей работе. Прежде чем я просто привяжусь к этому представлению из своей деятельности, выполните следующие действия:
setContentView(new CustomView(this));
без проблем.
Теперь, однако, мое представление становится более сложным, поэтому я делаю его частью FrameLayout, чтобы я мог сделать это базовым видом и добавить виджет Spinner поверх него. Проблема в том, что когда я это делаю, я получаю сообщение об ошибке:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.grafightscratch.ochemmer/com.grafightscratch.ochemmer.MoleculeTablet}: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
...
Caused by: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
...
Caused by: java.lang.ClassNotFoundException: com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView in loader [email protected]
Итак, этот вид работал до того, когда я напрямую связался с ним, но когда я попытался добавить его в файл main.xml как часть рамки, я получил указанную выше ошибку. Я также попытался вставить макет, только отображая его через:
<com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/molecule_tablet_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
Ничего не работает. Я продолжаю получать ошибки InflateException/ClassNotFoundException. Он жалуется на "строку №3" в двоичном XML файле, и если речь идет о main.xml, который является объявлением пакета, которое я проверил три раза.
ИЗМЕНИТЬ Я попытался сделать этот вид отдельным классом (т.е. Не внутренним классом), и он работает. После некоторого поиска я нашел несколько сообщений о том, что тег xml должен выглядеть так:
<com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView ...>
То есть знак доллара должен использоваться для ветки внутреннего класса от основного класса. Тем не менее, Eclipse barfs на этом, называет это ошибкой и отказывается позволить мне создавать или развертывать с этим символом. Итак, теперь возникает вопрос: как ссылается на представление, являющееся внутренним классом?
Для внутренних классов синтаксис будет выглядеть следующим образом:
<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />
Причина в том, что $является незаконным символом в тегах XML.
У меня была такая же проблема. Однако синтаксис в файле XML был правильным.
В результате я решил, что внутренний класс должен быть объявлен как статический. Например:
public static class myWebView extends WebView
для внутреннего класса:
<view class="{package}.{ParentClass}${innerClass}" />
и для внутреннего класса вы должны объявить свой класс:
public static InnerClass
static
.
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.example.Myproject.Myactivity$Myview"
android:layout_width="fill_parent" android:id="@+id/name" android:visibility="visible" android:layout_gravity="bottom" android:layout_height="fill_parent" android:focusableInTouchMode="true"
/>
этот код работал у меня. Когда я забыл некоторые элементы, такие как layout_width, моя программа разбилась. Мне также пришлось сделать мой класс класса статическим, чтобы он работал. В конце концов, это было бы так же, если бы я просто вынул его из гнезда. В примере примечания android используется вложенный класс.
Вам нужно указать полное имя класса вида в XML для инфляции, чтобы работать, и View Class, который будет найден в Runtime System.
Поскольку вы объявили свой View как внутренний класс своей деятельности, полное имя будет: <your_package_name>.OuterClassName.InnerClassName
Вы уверены, что com.grafightscratch.ochemmer.CustomView
- полное имя вашего класса?
EDIT: Спасибо, что напомнили мне об этом. Когда представления объявлены как вложенные классы, есть небольшая аберрация, см. Использовать Пользовательский компонент этого документа.
Вот несколько ключевых моментов для создания пользовательского представления внутри внутреннего класса...
public static class MainClass {
....
....
public class SubClassView extends LinearLayout {
public SubClassView(Context context, AttributeSet attrs) {
super(context, attrs);
.....
}
....
....
}
}
Макет должен быть следующим:
<view class = ".MainClass$SubClassView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/button"/>
Класс Java
XML файл