Intereting Posts
Android – простая пользовательская форма ввода веб-представления для встроенной java с jQuery Mobile Пользовательский адаптер ListView выбрасывает UnsupportedOperationException Централизованная обработка ошибок 2? BroadcastReceiver для включения / выключения экрана не работает Как передавать данные из отдельного класса потока в активность в Android Вход в Google не работает после публикации в магазине воспроизведения Запуск браузера на сэндвич с мороженым Соединение Android Studio ADB с подключенным подключенным устройством с 2.2 на Macintosh Прием и ротация Android намерения Как программно открыть встроенный эквалайзер в Android? Как сделать мой viewpager салфетки справа налево Захват намерений IntentService до onHandleIntent Поддерживает ли Android-плеер Android идентификатор сеанса в заголовках запросов HTTP? Android – Как программно сохранить сертификат в хранилище ключей? Будет ли Asio или Boost.Asio работать на iPhone или Android?

Получение контекста MainActivity в классе CustomView

Я знаю, что это простой вопрос, но я что-то упускаю.
У меня есть 2 класса: MainActivity и CustomView. У меня есть XML-макет с этим 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, который не работал. Не могли бы вы мне помочь?

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

Лучший способ сделать это,

 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; 

Если вас не волнует тот факт, что вы плотно связываете свои два класса, то вам нужно всего лишь указать вашу переменную «context» в MainActivity. Что-то вроде:

 ((MainActivity) context).myVar = 5; 

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

Или сделать переменную static и использовать ее так.

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

Я надеюсь, что это поможет вам.