1

'main'XMLファイルで宣言するカスタムビューがあります。

    <com.app.DrawView
    android:id="@+id/my_view"
    android:layout_height="match_parent"
    android:layout_width="match_parent" />

次に、私のアクティビティのonCreateメソッドで:

setContentView(R.layout.main);

これはすべて、カスタムビューを表示するために正常に機能します。しかし、私がする必要があるのは、カスタムビューに値を渡すことです。そこで、カスタムビュークラスのインスタンスを作成してみました。

DrawView drawView = (DrawView) findViewById(R.id.my_view);

次に、DrawViewクラスで、次のメソッドを作成しました。

public void setUserData(boolean data){
      useEraser = data;
}

さて、私の問題は、アクティビティ内のDrawViewオブジェクトに対してこのメ​​ソッドにアクセスしようとすると、NullPointerExeptionを取得し続けることです。

boolean value = true;
drawView.setUserData(value);

エラーは「drawView.setUserData(value)」行を指しています。私は何が間違っているのですか?私は単純な間違いを犯したに違いないことを知っていますが、それは私がそれを見つけようとして夢中になっています。どんな助けや提案も素晴らしいでしょう!

編集:私は正しく機能した答えを受け入れました、しかし、私はまだ私の元の解決策が機能しなかった理由を知りたいと思いました。それで、質問で正しく注文したにもかかわらず、私は

DrawView drawView = (DrawView)findViewById(R.id.my_view);

setContentView(R.layout.main);

私はそれが私が見落としていた単純な間違いであることを知っていました!回答ありがとうございます。ありがとうございました。そして、これが同様の問題に直面している人にとって役立つことを願っています。

4

2 に答える 2

1

新しいものを作成したい場合は、これを試してください、

ホルダーとしてXMLにlinearlayoutを配置します

<LinearLayout
        android:id="@+id/ln1"
        android:layout_width="wrap_content"
       android:layout_height="300dp" >

    </LinearLayout>

および以下のoncreateの使用

LinearLayout ln = (LinearLayout)findViewById(R.id.ln1);
         com.example.mixed.DrawView dw2 = new DrawView(getApplicationContext());
         dw2.setUserData(false);
         ln.addView(dw2);

レイアウトxmlに入れれば問題ありません。

ここに画像の説明を入力してください

于 2012-11-28T21:53:21.510 に答える
-2

メソッド呼び出しから例外を「受信」することはありません。メソッドは、try-catchブロックでキャッチする可能性のある例外をスローする場合があります。その場合、例外はcatchブロックによってキャッチされます。そうしないと、メソッド内で発生します。呼び出し元が例外をスローしているため、エラーはメソッドにありません。

この場合:

boolean value = true;
drawView.setUserData(value);

nullになる可能性があるのはdrawViewだけです。したがって、findViewByIdはnullを返すか、別の場所でdrawViewをnullに設定しています。ここにブレークポイントを設定することで、これを証明できます。

DrawView drawView = (DrawView) findViewById(R.id.my_view);

drawViewの値を検査します。

あなたが提供した情報から、なぜそうなるのかわかりませんが、これはあなたがしなければならないチェックです。

ちなみに、カスタムビューでは常に3つのビューコンストラクターのプロトタイプすべてを提供する必要があります。あなたが行方不明です:

 public DrawView(Context context, AttributeSet attrs, int defaultStyle){
 super(context, attrs, defaultStyle);

このコンストラクターは、デフォルトのウィジェットスタイルがオーバーライドされる場合に使用されます。

于 2012-11-28T22:18:01.407 に答える