0

私の実際の問題:CustomView1クラスに配列があります。CustomView2そして、私はクラスでそれにアクセスしたいです。それがいっぱいになったら、私は電話しなければなりませんview2.invalidate()

これは私の活動クラスです:

public class TestApp extends Activity {

        CustomView1 view1;

        CustomView2 view2;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            view1 = (CustomView1) findViewbyId(R.id.CustomViewID1);
            view2 = (CustomView2) findViewbyID(R.id.CustomViewID2);

        }
    }

これは私の最初のCustomViewクラスです。ここで を呼び出したいと思いますview2.invalidate()

public class CustomView1 extends View {

    byte[] bytearray = new byte[200];

    public CustomView1(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @override
    onDraw() {
        view2.invalidate();
    }

}

そして、これは私の2番目CustomViewのクラスです。ここでは、Activity クラスで作成したCustomView1(つまりobject ) クラスの同じオブジェクトにアクセスしたいと考えています。view1

public class CustomView2 extends View {

    public CustomView2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

このようなアクセスは可能ですか?それを行う方法は他にありますか?

4

2 に答える 2

0

CustomView2 view2;クラス内にメンバーを持つことができますCustomView1。レイアウト時に、view1 にその view2 を伝えるだけです。

これは次のようになります。

view2 = (CustomView2)findViewById(R.id.view2);
view1 = (CustomView1)findViewById(R.id.view1);
view1.setView2(view2);
于 2013-09-23T08:20:58.287 に答える
0

これが機能するには、カスタム ビュー クラス内にこれらのビューの参照が必要です。のようなものCustomView1(同じロジックが適用されCustomView2ます):

public class CustomView1 extends View
{

    byte[] bytearray  = new byte[200];
    private CustomView2 view2;

    public CustomView1(Context context, AttributeSet attrs) 
    {
       super(context, attrs);  
    }

    public void setCustomView2(CustomView2 view2) 
    {
       this.view2 = view2;
    }

    @override 
    onDraw()
    {
       if(view2 != null) //If view2 is not already set, we do not want a null pointer exception to occur
       {
          view2.invalidate();
       }
    }

}

それを使用するには、次のようなものが必要です。

public class TestApp extends Activity  
{ 

   CustomView1  view1 ;
   CustomView2  view2 ;


   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 

       view1   = (CustomView1) findViewbyId(R.id.CustomViewID1);
       view2   = (CustomView2) findViewbyID(R.id.CustomViewID2);

       view1.setCustomView2(view2);
       view2.setCustomView1(view1);

   }  
}

編集:CustomView1既に持っているものに加えて、クラス 用に別のカスタムコンストラクターを作成できます。このようなもの:

public CustomView1(Context context) 
{
     super(context);  
}

このようにして、ビューに null を渡すことを避けAttributeSet、次のようにカスタム ビューを呼び出しますCustomView1 view1 = new CustomView1(context)

コンストラクターは、public CustomView1(Context context, AttributeSet attrs)プログラムではなく、レイアウト xml ファイルを介してカスタム ビューを宣言する状況を処理するために使用されます。そのようにプログラムでビューのレイアウト プロパティを設定する必要があります。これを確認してください。

于 2013-09-23T08:21:11.447 に答える