在 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;

会起作用。但是你真的应该考虑一个只松散耦合你的 类.

的替代设计