Ошибка ссылки на внутренний класс View в layout / main.xml - PullRequest
55 голосов
/ 20 января 2010

Хмм ...

Я создаю подкласс зрения как внутренний класс в моей Деятельности. Прежде чем я просто связался с этим взглядом из моей деятельности с:

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 dalvik.system.PathClassLoader@43b74a28

Итак, это представление работало раньше, когда я связывался с ним напрямую, но когда я попытался добавить его в файл 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, то это объявление пакета, которое я трижды проверил.

EDIT Я попытался сделать это представление отдельным классом (т.е. не внутренним классом), и это работает. После некоторых поисков я нашел несколько сообщений о том, что тег xml должен выглядеть следующим образом:

<com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView ...>

Т.е. знак доллара должен использоваться для отделения внутреннего класса от основного класса. Тем не менее, Eclipse недоволен этим, называет это ошибкой и отказывается разрешить мне создавать или развертывать с этим персонажем. Теперь возникает вопрос: как ссылаться на View, являющийся внутренним классом?

Ответы [ 6 ]

150 голосов
/ 20 января 2010

Для внутренних классов синтаксис становится следующим:

<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />

Причина в том, что $ является недопустимым символом в тегах XML.

39 голосов
/ 04 июня 2011

У меня была такая же проблема. Однако синтаксис в XML-файле был правильным.

В итоге я решил, что проблема в том, что внутренний класс должен быть объявлен как статический. Например:

public static class myWebView extends WebView
11 голосов
/ 13 марта 2015

для внутреннего класса:

<view class="{package}.{ParentClass}${innerClass}" />

и для внутреннего класса вы должны объявить свой класс:

public static InnerClass

static требуется.

2 голосов
/ 27 апреля 2011
<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 используется вложенный класс.

1 голос
/ 14 сентября 2017

Вот несколько ключевых моментов для создания собственного представления во внутреннем классе ...

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 класс

  • статический требуется
  • требуется конструктор с AttributeSet (хотя бы один)

XML-файл

  • вид * тег 1023 * (в нижнем регистре НЕ отображается) требуется
  • тег класса с путем к вашему внутреннему классу, используя
  • $ вместо "." перед вашим именем SubClassView
0 голосов
/ 20 января 2010

Вам нужно указать полное имя вашего класса представления в XML, чтобы инфляция работала, и класс представления, который должен быть найден в среде выполнения.
Поскольку вы объявили свой View как внутренний класс своей деятельности, полное имя будет: <your_package_name>.OuterClassName.InnerClassName

Вы уверены, что com.grafightscratch.ochemmer.CustomView является полным именем вашего класса?

РЕДАКТИРОВАТЬ: Спасибо, что напомнили мне об этом. Когда представления объявляются как вложенные классы, возникает небольшая аберрация, см. Использовать пользовательский компонент этого документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...