Передача данных между вложенными фрагментами

Я работаю над проектом, где я должен передавать данные между фрагментами. Все данные предоставлены из моегоDatabaseHandler class (SQLiteOpenHelper). Я пишу этот пост вручную, поэтому игнорируйте синтаксические ошибки, если они есть.

Вот что мойActivity выглядит как (содержит SelectionFragment и InfoFragment):

Фрагмент выделения (содержитGridView)Информационный фрагмент (ViewPager с о5-6 child fragments)childFragment1childFragment2childFragment3...

Вот что я сделал до сих пор:

SelectFrag расширяет фрагмент:

MyCommunicator communicator;
GridView myGrid;

onItemSelected(... int position, ...) {
    communicator.respond("The id i get from getTag()..");
}
public void setCommunicator(MyCommunicator communicator) {
    this.communicator = communicator;
}

public interface MyCommunicator {
    public void respond(String id);
}



Активность расширяет FragmentActivity, реализует SelectFrag.MyCommunicator:

FragmentManager manager;
SelectFrag selectFrag;
InfoFrag infoFrag;

onCreate() {
    manager = getSupportFragmentManager();
    selectFrag = (SelectFrag) manager.findFragmentById(...);
    selectFrag.setCommunicator(this);
}

@Override
public void respond(String id) {
    DatabaseHandler db = new DatabaseHandler(this);
    try {
        CustomObject obj = db.getObj(id);
    } finally {
        db.close();
    }
    infoFrag = (InfoFrag) manager.findFragmentById(...);
    if(obj != null)
        infoFrag.changeObj(id)
    setTitle(obj.getName();
}


InfoFrag расширяет фрагмент:

ViewPager pager;
Context context;
MyObj obj;

public void changeObj(String id) {
    DatabaseHandler db = new DatabaseHandler(context);
    this.obj = db.getObj(id);
    db.close();
}

protect class MyPagerAdapter extends FragmentPagerAdapter{
    public Fragment getItem(int i) {
        Fragment frag = null;
        switch(i) {
            case 0:
                frag = new ChildFrag1();
            break;
            case 1:
                frag = new ChildFrag2();
            break;
            ... Goes to case 6 for now.
        }
        return frag;
    }
}

Вот мои макеты:

select_frag.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SelectFrag" >

    <GridView
        android:id="@+id/selectGridView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:columnWidth="56dp"
        android:background="#dd5500"
        android:horizontalSpacing="5dp"
        android:numColumns="auto_fit"
        android:paddingLeft="10dp"
        android:paddingRight="2dp"
        android:paddingTop="3dp"
        android:stretchMode="columnWidth"
        android:verticalSpacing="5dp" >
    </GridView>

</RelativeLayout>

main_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/selectFragment"
        android:name="my.package.SelectFragment"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="3" />

    <fragment
        android:id="@+id/infoFragment"
        android:name="my.package.InfoFragment"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="7" />

</LinearLayout>

info_fragment.xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/myPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/my_pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

</android.support.v4.view.ViewPager>

В настоящее время приложение передает информацию из selectFrag в Activity, которая передает ее в infoFrag. Я бы хотел, чтобы этот идентификатор доходил до фрагментов ребенка. Я думал о том, чтобы реализовать MyCommunicator для InfoFrag и передать данные дочерним фрагментам, но не вызовет ли это исключение NullPointerException для дочерних фрагментов, которые не видны.

*Запись: * SelectFrag и InfoFrag всегда видны в Activity. InfoFrag должен обновляться при выборе нового элемента в GridView selectFrag.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ:
Я пытался использовать «интерфейс связи», но каждый раз теряюсь :( смеется. Может кто-нибудь дать мне краткий способ сделать это? Могут ли все мои дочерние фрагменты реализовать коммуникатор из selectFrag? Если да, то это правильный способ сделать это? Я думаю, что InfoFragment должен реализовать интерфейс и передать данные своим дочерним элементам. Но я не знаю, как это сделать и обновить дочерние элементы. Еще одна вещь, о которой я думал, это хранить lastItemClicked в sharedPreferences и затем доступ к объекту из моей базы данных. Я действительно смущен: / Спасибо еще раз!

Ответы на вопрос(2)

Ваш ответ на вопрос