Подтвердить что ты не робот

Ошибка, связанная с внутренним классом View в макете/main.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 на этом, называет это ошибкой и отказывается позволить мне создавать или развертывать с этим символом. Итак, теперь возникает вопрос: как ссылается на представление, являющееся внутренним классом?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

public static class myWebView extends WebView

Ответ 3

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

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

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

public static InnerClass

static.

Ответ 4

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

Ответ 5

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

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

EDIT: Спасибо, что напомнили мне об этом. Когда представления объявлены как вложенные классы, есть небольшая аберрация, см. Использовать Пользовательский компонент этого документа.

Ответ 6

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

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

  • static требуется
  • конструктор с AttributeSet требуется (по крайней мере один)

XML файл

  • Тег
  • view (с нижним регистром NOT View) требуется
  • класс с указанием пути к вашему внутреннему классу, используя
  • $ вместо "." перед именем SubClassView