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();
    }

}

这是我的第二节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 回答