Итак, у меня есть ClientListView, который отлично работает, показывает клиентов, я могу щелкнуть по клиенту и получить его подробную информацию справа (во втором фрагменте).Определяемый этим макетом здесь:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment class="com.viciousbytes.studiotab.subactivities.ClientListView"
android:id="@+id/client_list" android:layout_weight="1"
android:layout_width="0px" android:layout_height="match_parent" />
<FrameLayout android:id="@+id/client_details" android:layout_weight="1"
android:layout_width="0px" android:layout_height="match_parent"
android:background="?android:attr/detailsElementBackground" />
</LinearLayout>
Это прекрасно работает, но потом я понял, что другое мое занятие (это была фрагментарность, отображающая фрагмент), занимало весь экран, и его лучше было бы разделить надва.
Итак, я пошел по поводу изменения кода, который первоначально отображал эту активность фрагмента
void showSessionEdit()
{
...
Intent intent = new Intent(getActivity(), EditSessionActivity.class);
// Send the recipe index to the new activity
intent.putExtra(EditSessionActivity.THE_SELECTED_CLIENT, (int)mClient.getID());
intent.putExtra(EditSessionActivity.SELECTED_SESSION, sessionId);
startActivityForResult(intent, 1899);
....
}
Это сработало замечательно, через мой редактор сессий, я щелкаю обратно и возвращаюсь к своим клиентам и подробностям.Хотя я понял, что хочу, чтобы мой редактор сеансов работал больше как мой список клиентов / детали, которые отображаются на одном экране.Через много МНОГО пробных ошибок я наконец-то заменил вышеупомянутое на это:
void showSessionEdit()
{
...
SessionEdit details = (SessionEdit) getFragmentManager().findFragmentById(R.id.session_edit);
// Make new fragment instance to show the recipe
details = SessionEdit.newInstance(mContext, mIsTablet, (int)mClient.getID(), sessionId);
// Replace the old fragment with the new one
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.client_list, details);
ft.addToBackStack("client_list");
// Use a fade animation. This makes it clear that this is not a new "layer"
// above the current, but a replacement
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
...
//now add another fragment to the right, just to test i dont have my invoice fragment done yet so I just added session again to see if it would display it does.
SessionEdit details2 = (SessionEdit) getFragmentManager().findFragmentById(R.id.session_edit);
// Make new fragment instance to show the recipe
details2 = SessionEdit.newInstance(mContext, mIsTablet, (int)mClient.getID(), sessionId);
// Replace the old fragment with the new one
FragmentTransaction ft2 = getFragmentManager().beginTransaction();
ft2.replace(R.id.client_details, details2);
ft.addToBackStack("client_details");
// Use a fade animation. This makes it clear that this is not a new "layer"
// above the current, but a replacement
ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft2.commit();
...
}
Это работает хорошо, хотя я понял, что заменял не "div"
так сказать на макете, а фрагментсам по себе, поэтому мои ссылки на findFragmentById
больше не были типом client_details
или client_list
, а теперь типом SessionEdit
.Таким образом, после дополнительных проб и ошибок я научился добавлять тег к addToBackStack(tag)
, и теперь я мог найти фрагментыByTag, это сработало хорошо, и кнопка «Назад» работала: нажатие на кнопку «Назад» заменило бы мой client_list слева, чтобы я мог щелкнуть клиентов и получитьих детали справа, проблема в том, что если бы мой client_list вернулся снова, то детали справа все равно показали бы мой фрагмент сеанса.Еще одна проблема заключается в том, что мой список клиентов был ListFragment
, поэтому, когда я сделал замену, я все еще мог видеть список как под новым фрагментом, как будто это был целлулоид или что-то еще.Очень странно.
Так что я добился некоторого прогресса в замене моих исходных фрагментов новыми, но навигация с помощью кнопки «Назад» больше не работает «из коробки», как это было, когда я просто делал два фрагмента и добавлял новыедействия друг на друга.Так как же перемещаться по нескольким фрагментам?В идеале у меня была бы SessionInvoiceActivity, которая заменяла бы оба фрагмента одновременно (список клиентов слева, детали клиента справа) с сеансом слева, счета-фактуры справа.И когда нажимается кнопка, я возвращаюсь в мой список клиентов и детали клиента?Но я не знаю, как это сделать, и все равно передаю нужную мне информацию.Мне также все еще не ясно, почему, когда я заменяю фрагмент, оригинальный фрагмент может быть замечен внизу?Это проблема определения макета XML?