Вызов метода Activity из пользовательского представления

Как вызвать метод активности из пользовательского представления?

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)

Итак, вы пробовали: ((MyActivity) mContext).onClick(v)?

Dinesh Shingadiya 27.05.2019 14:56

Да, он отлично работает, но когда я создаю CustomView из SecondActivity, он требует ((SecondActivity) mContext).onClick(v). Я хочу, чтобы это было универсально.

Said 27.05.2019 14:57

Попробуйте использовать interface, как сказал CommonsWare!

Dinesh Shingadiya 27.05.2019 15:03
2
3
395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Делайте то, что делают все существующие виджеты: принимайте обратный вызов. Так:

Шаг № 1: Определите какой-либо интерфейс обратного вызова или прослушивателя.

Шаг № 2: Добавьте set...() к виджету, чтобы принять экземпляр этого интерфейса, удерживая его в поле.

Шаг № 3. Сделайте так, чтобы активность, фрагмент или что-то еще вызывали этот метод set...()

Шаг № 4: Попросите представление вызвать обратный вызов (если он был предоставлен) при возникновении события

Вы можете увидеть, как этот шаблон реализован для таких вещей, как setOnClickListener().

Да, я сделал это таким образом. Я подумал, может быть, есть другой способ, так как представление знает, что является его родителем, но оно не может быть общим... В любом случае спасибо!

Said 27.05.2019 15:22

@Said: при разработке приложений для Android Jetpack большая часть работы с пользовательским интерфейсом управляется фрагментами, а не действиями. Их можно даже настроить с помощью выражений привязки данных. Это делает еще больший упор на использование обратных вызовов, а не на подход, который вы пробовали, поскольку очень маловероятно, что вы хотите, чтобы действие обрабатывало событие.

CommonsWare 27.05.2019 15:33

Другие вопросы по теме