web-dev-qa-db-ja.com

layout / main.xmlの内部クラスビューの参照エラー

Grrr ...

アクティビティの内部クラスとしてビューのサブクラスを作成します。アクティビティからこのビューに単純にリンクする前に:

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

そのため、このビューは以前は直接リンクしたときに機能していましたが、framelayoutの一部として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エラーが発生し続けます。バイナリXMLファイルの「行#3」について文句を言い、それがmain.xmlについて話している場合、それは私がトリプルチェックしたパッケージ宣言です。

[〜#〜] edit [〜#〜]このビューを別のクラス(つまり、内部クラスではない)にしようとしましたが、動作します。いろいろ調べてみたところ、xmlタグは次のようになっているという投稿を見つけました。

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

つまり、インナークラスをメインクラスから分離するためにドル記号を使用する必要があります。しかし、これに関するEclipse barfsはエラーと呼び、そのキャラクターでのビルドまたはデプロイを許可しません。それで、質問は次のようになります:内部クラスであるビューをどのように参照するのですか?

56
IcedDante

内部クラスの構文は次のようになります。

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

理由は、$はXMLタグの不正な文字だからです。

152
Romain Guy

私は同じ問題を抱えていました。ただし、XMLファイルの構文は正しいものでした。

最終的に問題を解決したのは、内部クラスを静的として宣言する必要があるということでした。例えば:

public static class myWebView extends WebView
39
Whatzit Toya

内部クラスの場合:

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

内部クラスの場合、クラスを宣言する必要があります。

public static InnerClass

staticはrequireです。

11
<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 noteの例では、ネストされたクラスを使用しています。

2
justin

以下は、内部クラス内でカスタムビューを作成するための重要なポイントです。

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クラス

  • 静的が必要です
  • constructor AttributeSetが必要です(少なくとも1つ)

XMLファイル

  • viewタグ(小文字のNOT View)が必要です
  • クラスタグを使用して、内部クラスへのパス
  • $の代わりに「。」 SubClassView名の前
1
karenms

インフレーションが機能するようにXMLでビュークラスの完全修飾名を指定し、ランタイムシステムでビュークラスを見つける必要があります。
ビューをアクティビティの内部クラスとして宣言しているため、完全修飾名は<your_package_name>.OuterClassName.InnerClassName

本気ですか com.grafightscratch.ochemmer.CustomViewはクラスの完全修飾名ですか?

編集:これを思い出させてくれてありがとう。ビューがネストされたクラスとして宣言されている場合、わずかな異常があります。このドキュメントの seカスタムコンポーネント を参照してください。

0
Samuh