在CustomView类中获取MainActivity上下文

时间:2015-12-23 19:02:25

标签: java android android-context custom-view

我知道这是一个简单的问题,但我遗漏了一些东西 我有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。 你能帮我吗?

4 个答案:

答案 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;

会奏效。但是你真的应该考虑一种只能松散地与你的课程结合的替代设计。