2015-12-23 69 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