2015-12-23 32 views
3

我知道这是一个简单的问题,但我错过了一些东西。
我有2个类:MainActivity和CustomView。 我有这个CustomView的XML布局。在CustomView类中获取MainActivity上下文

我想从我的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没有工作。 你能帮我吗?

回答

5

通过尝试访问您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); 
+0

嘿谢谢你的回答,我明白你的意思,但我仍然没有得到什么更好的设计来解决我的问题。如果myVar是一个gridView,那么我的customView实际上就是surfaceView。当我绘制surfaceView时 - 我需要知道有关GridView位置的信息(在“onTouchEvent”中,我需要类似于context.myVar.pointToPosition(x,y))。还有什么其他方法可以获得另一个视图的位置if不是这样的设计吗? – SHAI

+0

如果我正确地理解了你,当GridView发生触摸事件时,你需要在SurfaceView上画一些东西,然后你可以在你的SurfaceView中创建一个公用方法,你可以在GridView的onTouch中调用它。以帮助你没有所有的细节,但我想说的主要想法是,每个视图应该是独立的,并根据原始数据绘制/修改自己,而不是持有对其他视图或活动的引用。 – 2Dee

+0

谢谢我'你会试试看! – SHAI

1

或使静态变量和使用它像这样。

MainActivity.myVar=7; 

,或者如果您想在自定义视图初始化取决于变量从在MainActivity再去做这样的自定义视图。

private int myVar; 
public void init(int myVar) { 
    this.myVar = myVar; 
    invalidate(); 

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

我希望这对你有所帮助。这样做,是

+1

你提出的第二种解决方案基本上和我的一样,第一种解决方案是一个**糟糕的主意,实例化一个Activ你自己应该**从未**完成,请参阅[这个问题](http://stackoverflow.com/questions/10606537/when-am-i-supposed-to-instantiate-activity-class)了解详情... – 2Dee

+0

你的权利谢谢!我把它记下来 –

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

实例化,在MyCustomView内部功能

customView = (MyCustomView) findViewById(R.id.view2); 
customView.setActivity(this); 

访问变量,

mActivity.myVar = 10; 
+0

谢谢Sazzad,我已经尝试过,但由于某种原因,它没有工作,我无法在“mActivity”中找到“我的变种”。但2Dee是对的,我需要为我的项目考虑更好的设计,并解决了我的问题......谢谢。 – SHAI

+0

如果myVar是公开的,它应该可以访问。无论如何感谢搭售... –

1

如果你不关心事实你紧紧地联系你的两个班级,那么你唯一需要做的就是改变你的“con文本“变量到MainActivity。例如:

((MainActivity) context).myVar = 5; 

将工作。但是你真的应该考虑一个只能松散地结合你的课程的替代设计。

+0

*如果你不关心紧耦合“ - >有些人只是想看世界烧伤;-) – 2Dee

+0

谢谢你是对的,你的解决方案真的有用!但最后我使用了2Dee解决方案,谢谢。 – SHAI