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はエラーと呼び、そのキャラクターでのビルドまたはデプロイを許可しません。それで、質問は次のようになります:内部クラスであるビューをどのように参照するのですか?
内部クラスの構文は次のようになります。
<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />
理由は、$はXMLタグの不正な文字だからです。
私は同じ問題を抱えていました。ただし、XMLファイルの構文は正しいものでした。
最終的に問題を解決したのは、内部クラスを静的として宣言する必要があるということでした。例えば:
public static class myWebView extends WebView
内部クラスの場合:
<view class="{package}.{ParentClass}${innerClass}" />
内部クラスの場合、クラスを宣言する必要があります。
public static InnerClass
static
はrequireです。
<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の例では、ネストされたクラスを使用しています。
以下は、内部クラス内でカスタムビューを作成するための重要なポイントです。
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ファイル
インフレーションが機能するようにXMLでビュークラスの完全修飾名を指定し、ランタイムシステムでビュークラスを見つける必要があります。
ビューをアクティビティの内部クラスとして宣言しているため、完全修飾名は<your_package_name>.OuterClassName.InnerClassName
本気ですか com.grafightscratch.ochemmer.CustomView
はクラスの完全修飾名ですか?
編集:これを思い出させてくれてありがとう。ビューがネストされたクラスとして宣言されている場合、わずかな異常があります。このドキュメントの seカスタムコンポーネント を参照してください。