Передача данных между вложенными фрагментами
Я работаю над проектом, где я должен передавать данные между фрагментами. Все данные предоставлены из моего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 и затем доступ к объекту из моей базы данных. Я действительно смущен: / Спасибо еще раз!