【问题标题】:Getting MainActivity context in CustomView class在 CustomView 类中获取 MainActivity 上下文
【发布时间】:2015-12-23 19:02:25
【问题描述】:

我有 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,但没有用。

【问题讨论】:

    标签: java android android-context custom-view


    【解决方案1】:

    通过尝试直接在 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);
    

    【讨论】:

    • 您好,谢谢您的回答,我明白您的意思,但我仍然不知道有什么更好的设计来解决我的问题。如果myVar 是gridView,而我的customView 实际上是surfaceView 怎么办。当我在surfaceView中绘制时-我需要知道有关GridView位置的信息(在“onTouchEvent”中我需要类似“context.myVar.pointToPosition(x,y))。如果有其他方法,我还有什么其他方法可以获取另一个视图的位置不是这个设计吗?
    • 如果我理解正确的话,当 GridView 上发生触摸事件时,您需要在 SurfaceView 上绘制一些东西吗?然后,您可以在 SurfaceView 中创建一个公共方法,您将在 GridView 的 onTouch 中调用该方法。如果没有所有细节,很难为您提供帮助,但我想说的是,主要思想是每个视图应该是独立的,并根据原始数据绘制/修改自身,而不是引用其他视图或 Activity。跨度>
    • 谢谢,我试试看!
    • @SHAI 在下面看到我的答案
    【解决方案2】:

    最好的办法是,

    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;
    

    【讨论】:

    • 感谢 Sazzad,我已经尝试过了,但由于某种原因它不起作用,我在“mActivity”中找不到“my var”。但是 2Dee 是对的,我需要为我的项目考虑一个更好的设计,它解决了我的问题......谢谢。
    【解决方案3】:

    如果您不关心两个类紧密耦合的事实,那么您唯一需要做的就是将“上下文”变量类型转换为 MainActivity。比如:

    ((MainActivity) context).myVar = 5;
    

    会起作用。但是你真的应该考虑一种替代设计,它只是松散地耦合你的类。

    【讨论】:

    • *如果你不关心 [...] 紧耦合" --> 有些人只想看着世界燃烧 ;-)
    • 谢谢您是对的,您的解决方案确实有效!不过最后还是用了2Dee解决方案,谢谢。
    【解决方案4】:

    或将变量设为静态并像这样使用它。

     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);
    }
    

    希望对你有帮助。

    【讨论】:

    • 您提出的第二种解决方案与我的基本相同。另一方面,第一个想法是一个糟糕的想法,自己实例化一个 Activity 应该永远完成,详情请参阅this question...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多