在 CustomView 中获取 MainActivity 上下文 class
Getting MainActivity context in CustomView class
我有 2 个 classes:MainActivity 和 CustomView。我有一个带有此 CustomView 的 XML 布局。
我想从我的 CustomView class 访问我的所有 MainActivity 变量并修改它们,我试图获取上下文但没有成功。
主要活动class:
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;
}
MyCustomViewclass:
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 但没有用。
通过尝试直接在 TextView
子类中访问 Activity
中的变量,您在 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);
或者将变量设为静态并像这样使用它。
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);
}
希望对你有所帮助。
最好的方法是,
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;
如果您不关心两个 类 紧密耦合这一事实,那么您唯一需要做的就是将 "context" 变量类型转换为 MainActivity。类似于:
((MainActivity) context).myVar = 5;
会起作用。但是你真的应该考虑一个只松散耦合你的 类.
的替代设计
我有 2 个 classes:MainActivity 和 CustomView。我有一个带有此 CustomView 的 XML 布局。
我想从我的 CustomView class 访问我的所有 MainActivity 变量并修改它们,我试图获取上下文但没有成功。
主要活动class:
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;
}
MyCustomViewclass:
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 但没有用。
通过尝试直接在 TextView
子类中访问 Activity
中的变量,您在 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);
或者将变量设为静态并像这样使用它。
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);
}
希望对你有所帮助。
最好的方法是,
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;
如果您不关心两个 类 紧密耦合这一事实,那么您唯一需要做的就是将 "context" 变量类型转换为 MainActivity。类似于:
((MainActivity) context).myVar = 5;
会起作用。但是你真的应该考虑一个只松散耦合你的 类.
的替代设计