Подтвердить что ты не робот

Вызов методов активности из фрагмента

Я использую фрагмент только внутри одной конкретной родительской активности. Теперь я задаюсь вопросом, есть ли недостатки, если я вызываю методы в родительской активности непосредственно из включенного фрагмента следующим образом:

getActivity(). SomeMethodInParentActivitiy()

Более распространенным решением было бы определить формальный интерфейс слушателя во фрагменте для возврата к родительской активности, а затем сделать реализацию этого интерфейса.

Есть ли какие-либо причины (например, надежность или скорость), почему я должен использовать второе более сложное решение вместо прямых вызовов метода из фрагмента в активность?

4b9b3361

Ответ 1

Не смотрите на производительность в начале. Помните: "преждевременная оптимизация - это корень всего зла". Второй подход лучше, потому что ваш фрагмент можно использовать в разных действиях. Первый подход вводит больше зависимостей в ваш код, фрагмент зависит от типа активности. Вы теряете способность тестировать, повторно использовать, небольшой комплекс. Сейчас это может показаться более простым, но в будущем вы увидите: -)

Ответ 2

Необходимо выполнить дополнительные действия:

Activity activity123 = getActivity();

if(activity123 instanceof ParentActivity) {
    ((ParentActivity) activity123).someMethodInParentActivity();
}

однако, как писал @pawelzieba, если вы хотите использовать этот фрагмент в других действиях, которые, вероятно, будут работать так. Cheers

Ответ 3

Когда мне нужно сделать что-то подобное, я просто использую BroadcastReceiver, чтобы я мог его вызвать из любой точки.

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action != null) {
            if (action.equals("WHATEVER_ACTION")) {
                // Do stuff
            }
        }
    }
};

Тогда в моем фрагменте я просто использую:

activity.sendBroadcast(новый Intent(). setAction ( "WHATEVER_ACTION" ));