将一个自定义视图的对象访问到在Activity类上创建的另一个自定义视图

时间:2013-09-23 08:05:51

标签: android android-canvas android-custom-view

我的实际问题:我在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(即view1 object)类的同一对象。

public class CustomView2 extends View {

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

这样可以访问吗?还有其他想法怎么做?

2 个答案:

答案 0 :(得分:0)

您可以在CustomView2 view2;课程中拥有CustomView1成员。在布局时,只需告诉view1它的view2是什么。

这可能如下所示:

view2 = (CustomView2)findViewById(R.id.view2);
view1 = (CustomView1)findViewById(R.id.view1);
view1.setView2(view2);

答案 1 :(得分: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); } 类创建另一个自定义构造函数。像这样:

AttributeSet

这样您就可以避免将空CustomView1 view1 = new CustomView1(context)传递给您的视图,并调用自定义视图,如下所示:public CustomView1(Context context, AttributeSet attrs)

{{1}}构造函数用于处理通过布局xml文件而不是以编程方式声明自定义视图的情况。您需要以这种方式以编程方式设置视图的布局属性。检查this以获取帮助。