Фрагменты Замена фрагментов и навигация по фрагментам с пользой - PullRequest
1 голос
/ 26 июля 2011

Итак, у меня есть 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?

1 Ответ

1 голос
/ 14 июня 2012

Я не уверен, что вы поняли это сейчас, кажется, я позади.

Я обнаружил, что фрагменты, указанные в макетах (в XML), и фрагменты, добавленные с помощью FragmentManager, трудно смешать.

У меня похожая проблема: я добавляю свой «Основной» фрагмент в onCreate (), затем, когда это будет сочтено необходимым по размеру или выбору пользователя, второй фрагмент «Детали» либо помещается туда, где был «Главный» фрагмент, либо добавляется во второй макет, если он находится в ландшафтном режиме. Когда пользователь нажимает клавишу «Назад», он показывает пустой экран без «основного» фрагмента. Я подумал, что мог бы обойти эту проблему, сделав исходный вызов для отображения моего фрагмента «Master» в onStart () в Activity. Тем не менее, кажется, есть еще одна ошибка в этом. При добавлении фрагмента «Master» из onStart () НЕ добавляйте транзакцию в BackStack. Таким образом, вместо этого будет вызываться onResume () или что-либо из вашей предыдущей активности, таким образом, не оставляя активность с пустым экраном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...