Android вложенный фрагмент и интерфейс - PullRequest
0 голосов
/ 06 мая 2018

У меня есть фрагмент A, который имеет интерфейс, который будет возвращать значение TextView. Фрагмент A инициализируется и присоединяется к FragmentB. Вот код для фрагментов A и B.

Фрагмент А

public class FragmentA extends Fragment {
    ...

    public interface Listener {
       void onValue(int value);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof Listener) {
            listener = (Listener) context;
        } else {
            throw new RuntimeException(context.toString() + " must implement Listener");
        }
    }
}

Фрагмент Б

public class FragmentB extends Fragment implements FragmentA.Listener {    
    ...

    private void initFragmentA() {
        FragmentManager fragmentManager = getChildFragmentManager();
        fragmentA = FragmentA.newInstance();
        fragmentManager.beginTransaction().add(container, fragmentA, TAG).commit();
    }

    @Override
    public void onValue(int value) {

    }
}

При запуске приложения произошла ошибка:

Java.lang.RuntimeException: ####.page.MainActivity@1f7f316c must implement Listener 
    at ####.widget.FragmentA.onAttach(FragmentA.java:66)

MainActivity содержит фрагмент B, но фрагмент B уже реализовал интерфейс фрагмента A. Почему произошла ошибка? Интерфейс, реализованный в родительском фрагменте, не работает?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

С Веб-сайт разработчика Android , там написано:

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

Чтобы разрешить фрагменту взаимодействовать с его действием, вы можете определить интерфейс в классе фрагмента и реализовать его в действии. Фрагмент захватывает реализацию интерфейса во время его метода жизненного цикла onAttach () и затем может вызвать методы интерфейса для связи с Activity.

Поэтому, когда вы реализуете этот интерфейс во фрагменте B, он выдает ошибку RuntimeException.

Резюме: вы должны внедрить этот интерфейс в свою деятельность по размещению фрагментов.

Подробнее о том, как передавать данные между фрагментами через хостинг (обычно мы используем Bundle), можно узнать по http://www.vogella.com/tutorials/AndroidFragments/article.html

0 голосов
/ 06 мая 2018

Сообщение об ошибке довольно ясно. Когда вы используете onAttach, пропущенный context на самом деле является хостом Activity - самым большим боссом из всех, а не родительским фрагментом. Так что FragmentB, которые реализуют интерфейс, но не получат никаких обновлений.

Вы должны использовать getParentFragment для доступа к FragmentB из FragmentA, а затем привести его к интерфейсу Listener.

...