我的实际问题:我在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);
}
}
这样可以访问吗?还有其他想法怎么做?
答案 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以获取帮助。