Как вызвать метод активности из пользовательского представления?
public class CustomView extends LinearLayout {
private Context mContext;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init(context, attrs);
}
private void init(Context context, AttributeSet attributes) {
findViewById(R.id.textView).setOnClickListener(v -> ((MyActivity) mContext).onClick(v));
}
}
Это прекрасно работает, так как я знаю, что View
генерируется из MyActivity
.
Есть ли способ узнать, какое действие создало это CustomView
? Что-то вроде getActivity().onClick(v)
Да, он отлично работает, но когда я создаю CustomView из SecondActivity, он требует ((SecondActivity) mContext).onClick(v). Я хочу, чтобы это было универсально.
Попробуйте использовать interface
, как сказал CommonsWare!
Делайте то, что делают все существующие виджеты: принимайте обратный вызов. Так:
Шаг № 1: Определите какой-либо интерфейс обратного вызова или прослушивателя.
Шаг № 2: Добавьте set...()
к виджету, чтобы принять экземпляр этого интерфейса, удерживая его в поле.
Шаг № 3. Сделайте так, чтобы активность, фрагмент или что-то еще вызывали этот метод set...()
Шаг № 4: Попросите представление вызвать обратный вызов (если он был предоставлен) при возникновении события
Вы можете увидеть, как этот шаблон реализован для таких вещей, как setOnClickListener()
.
Да, я сделал это таким образом. Я подумал, может быть, есть другой способ, так как представление знает, что является его родителем, но оно не может быть общим... В любом случае спасибо!
@Said: при разработке приложений для Android Jetpack большая часть работы с пользовательским интерфейсом управляется фрагментами, а не действиями. Их можно даже настроить с помощью выражений привязки данных. Это делает еще больший упор на использование обратных вызовов, а не на подход, который вы пробовали, поскольку очень маловероятно, что вы хотите, чтобы действие обрабатывало событие.
Итак, вы пробовали:
((MyActivity) mContext).onClick(v)
?