2015-12-23 5 views
3

Я знаю, что это простой вопрос, но мне что-то не хватает.
У меня есть 2 класса: MainActivity и CustomView. У меня есть XML-макет с этим CustomView.Получение контекста MainActivity в классе CustomView

Я хочу получить доступ ко всем моим переменным MainActivity из своего класса CustomView, а также для их изменения, Я попытался получить контекст, но он не сработал.

класс 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

При попытке получить доступ к переменным из вашего 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); 
+0

Эй, спасибо за ваш ответ, я понимаю, что вы говорите, но я до сих пор не понимаю, что является лучшим дизайном для моей проблемы. Что делать, если myVar является gridView, а мой customView - фактически viewView. Когда я рисую в surfaceView - мне нужно знать информацию о позиции GridView (в «onTouchEvent» мне нужно что-то вроде «context.myVar.pointToPosition (x, y)). Какими другими способами я могу получить позиции другого представления, если а не этот дизайн? – SHAI

+0

Если я правильно понял вас, когда в GridView происходит событие касания, вам нужно нарисовать что-то на SurfaceView? Тогда вы можете создать публичный метод в SurfaceView, который вы бы назвали onTouch вашего GridView. чтобы помочь вам, не имея всех подробностей, но я бы сказал, что основная идея состоит в том, что каждый вид должен быть независимым и рисовать/модифицировать себя на основе необработанных данных, а не ссылаться на другие виды или на активность. – 2Dee

+0

Спасибо, Попробуем это! – SHAI

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

Надеюсь, это поможет вам.

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

Instantiate,

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

переменной доступа внутри функций в MyCustomView,

mActivity.myVar = 10; 
+0

Спасибо Sazzad, я уже пробовал, но по какой-то причине это не сработало, я не смог найти «мой var» в «mActivity». Но 2Dee был прав, мне нужно было подумать о лучшем дизайне для моего проекта, и он решил мою проблему ... Спасибо. – SHAI

+0

Если myVar является общедоступным, он должен быть доступен. в любом случае спасибо за привязку ... –

1

Если вы не заботитесь о том, что вы плотно соединяете свои два класса, тогда единственное, что вам нужно сделать, это придумать свой «con text "в MainActivity. Что-то вроде:

((MainActivity) context).myVar = 5; 

будет работать. Но вы действительно должны рассмотреть альтернативный дизайн, который только свободно соединяет ваши классы.

+0

* Если вас не волнует [...] плотная муфта "-> некоторые люди просто хотят смотреть, как мир горит ;-) – 2Dee

+0

Спасибо, что вы правы, и ваше решение действительно работает! Благодарю вас, но я использовал решение 2Dee. – SHAI