8

私は3つのViewコンストラクターを実装するカスタマイズされたTextViewを持っています(nb、これはAndroidアプリでの私の最初の刺し傷です):

public class DynamicGeometryTextView extends TextView {

    public DynamicGeometryTextView (Context con) { super(con); }

    public DynamicGeometryTextView (Context con, AttributeSet attrs) {
        super(con, attrs);
    }

    public DynamicGeometryTextView (Context con, AttributeSet attrs, int style) {
        super(con, attrs, style); 
    }

これは、外部クラスからインスタンスデータにアクセスする必要があるため、非静的内部クラスです。.xmlレイアウトで表示されます。

<view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView"
    android:id="@+id/chalkboard"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /> 

すべてが正常にコンパイルおよびインストールされますが、実行時には次のようになります。

Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView
    at android.view.LayoutInflater.createView(LayoutInflater.java:596)                                                                         
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)                                                                  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)                                                                           
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)                                                                            
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)                                                                            
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)                                                                            
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)                                                       
    at android.app.Activity.setContentView(Activity.java:1867)                                                                                 
    at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)                                                                             
    at android.app.Activity.performCreate(Activity.java:5008)                                                                                  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)                                                             
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)                                                              
    ... 11 more                                                                                                                                
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]                       
    at java.lang.Class.getConstructorOrMethod(Class.java:460)                                                                                  
    at java.lang.Class.getConstructor(Class.java:431)                                                                                          
    at android.view.LayoutInflater.createView(LayoutInflater.java:561)                                                                         
    ... 22 more                                    

私の目には、これはコンストラクターの(Context、AttributeSet)バージョンが見つからないことを意味します...しかし、それは存在します。私はAndroidカスタムビューコンストラクターのような他のいくつかのSO投稿を見てきましたが、これはすべて同じ結論を示しており(私の目には)、カスタムコンポーネントに関するAPIガイドを繰り返し読んでいますが、これ以上に困惑しています1時間。

誰かアイデアはありますか?これをさらにデバッグする方法はありますか?

POSTERITYの場合、つまり、私のようにこれに不慣れな人は、カスタムビューがXMLレイアウトで参照されている場合、非静的内部クラスは使用できませんが、プログラムで作成すると、次のように機能します。

    LayoutInflater lif = getLayoutInflater();
    ViewGroup layout = (ViewGroup)lif.inflate(R.layout.board, null);

    tv = new DynamicGeometryTextView(this);

    layout.addView((View)tv);

この場合、実際に使用するコンストラクターと一致する必要があるだけです。レイアウトパラメーター(WRAP_CONTENTなど)はsetLayoutParams()、Viewから継承されるコンストラクターで設定できます。

4

2 に答える 2

9

外部クラスのインスタンスを参照せずに非静的内部クラスをインスタンス化する方法はありません。

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

したがって、これがレイアウトインフレータがクラスを膨らませることができなかった理由である可能性があります。外部クラスメンバーへの参照を削除した後、クラスを静的にします。

于 2012-07-25T17:39:35.950 に答える
9

変化する:

public class DynamicGeometryTextView extends TextView {

に:

public static class DynamicGeometryTextView extends TextView {

適切に参照するには、static内部クラスである必要があります

于 2012-07-25T17:40:33.443 に答える