我知道这是一个简单的问题,但我遗漏了一些东西 我有2个类:MainActivity和CustomView。 我有一个带有这个CustomView的XML布局。
我想从我的CustomView类访问所有MainActivity变量并修改它们, 我试图获得上下文,但它没有用。
MainActivity类:
MyCustomView customV;
int myVar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_page);
customV = (MyCustomView) findViewById(R.id.view2);
myVar = 5;
}
MyCustomView类:
public class MyCustomView extends TextView {
public MyCustomView(Context context) {
super(context);
init();
}
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
context.myVar = 7 //this is what I'm trying to do...
我也尝试过无法使用的getContext。 你能帮我吗?
答案 0 :(得分:6)
尝试直接在Activity
子类中访问TextView
中的变量,引入了Actity
子类与自定义TextView
之间的紧密耦合,这实际上阻碍了您的自定义TextView
的可重用性,因为它只能在Activity
的那种类型中使用,在另一种布局中使用它会破坏所有内容。基本上,我会说它设计不好,不会推荐这种方法。
您只需向自定义TextView
添加方法,然后在其中使用变量:
public class MyCustomView extends TextView {
// your code
public void setVariable(int myInt){
//use the int here, either set a member variable
//or use directly in the method
}
}
并在Activity
customV = (MyCustomView) findViewById(R.id.view2);
customV.setVariable(5);
答案 1 :(得分:1)
或将变量设为静态并像这样使用它。
MainActivity.myVar=7;
或者如果要在自定义视图中初始化,则取决于MainActivity中的变量,然后在自定义视图中执行此操作。
private int myVar;
public void init(int myVar) {
this.myVar = myVar;
invalidate();
在MainActivity中。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_page);
customV = (MyCustomView) findViewById(R.id.view2);
myVar = 5;
customV.init(myVar);
}
我希望这对你有所帮助。
答案 2 :(得分:1)
最好的方法是,
public class MyCustomView extends TextView {
private MainActivity mActivity;
public void setActivity(MainActivity activity) {
mActivity = activity;
}
public MyCustomView(Context context) {
super(context);
init();
}
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
}
实例化,
customView = (MyCustomView) findViewById(R.id.view2);
customView.setActivity(this);
在MyCustomView
,
mActivity.myVar = 10;
答案 3 :(得分:1)
如果你不关心你紧密耦合你的两个班级的事实,那么你唯一需要做的就是强调你的" context"变量到MainActivity。类似的东西:
((MainActivity) context).myVar = 5;
会奏效。但是你真的应该考虑一种只能松散地与你的课程结合的替代设计。