2013-09-23 79 views
0

我实际的问题:我有CustomView1类的数组。我想在CustomView2课程中访问它。当它填满时,我必须拨打view2.invalidate()访问对象,在Activty类创建

这是我的活动类:

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对象)类的相同对象。

public class CustomView2 extends View { 

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

是否可以像这样访问?任何其他想法如何做到这一点?

回答

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)构造函数是用来处理您声明您的自定义查看通过布局的XML文件,而不是编程的情况。您将需要通过编程方式设置视图的布局属性。检查this寻求帮助。

+0

我可以创建CustomView1类这样的对象。 \t CustomView2 = new CustomView2(context,null); – Tejas

+0

我是面向对象编程的新手。我们也可以使用这种方法进行普通课程吗? – Tejas

+0

@ user2737044对于你的第一个问题,我已经更新了我的答案。是的,你可以使用这个aproach正常的类(不是活动,服务等)。 – Angelo

0

你可以只是你CustomView1类中的CustomView2 view2;成员。在布局时间,告诉view1什么是view2。

这可能是这样的:

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