2013-05-26 4 views
1

У меня есть необходимость заменить один исходный фрагмент (я назову его A) с двумя другими фрагментами (B и C в «обычном» списке + конфигурации зрителя). В настоящее время у меня есть относительное расположение с двумя макетов кадров выступает в качестве заполнителя для B и C:Два фрагмента вместо одного

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <RadioGroup 
     android:id="@+id/radiogroup_navigation" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <!-- Some radiobuttons (not displayed for the sake of brevity) --> 
    </RadioGroup> 

<FrameLayout 
    android:id="@+id/frame_list" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentBottom="true" 
    android:layout_below="@id/radiogroup_navigation"> 
</FrameLayout> 

<FrameLayout 
    android:id="@+id/frame_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentBottom="true" 
    android:layout_below="@id/radiogroup_navigation" 
    android:layout_toRightOf="@id/frame_list"> 
</FrameLayout> 

Когда мне нужно отобразить А, я просто скрыть frame_list и добавить к frame_view , и когда мне нужно отобразить B и CI, установите frame_list, видимый, и добавьте два фрагмента в каждый фрейм в той же транзакции фрагмента.

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
t.remove(fragmentA); 
t.add(R.id.frame_list, fragmentB); 
t.add(R.id.frame_view, fragmentC); 
t.addToBackStack(null); 
t.commit(); 

Таким образом, когда я нажимаю кнопку назад, как C и B уходят, и я вернулся к фрагменту, но теперь frame_list виден (и пустой).

Я имею в виду, чтобы решить эту проблему двумя способами:

  • наиважнейшая onBackPressed скрыть левую рамку, если это необходимо;
  • гнездо B и C в другом фрагменте;

Но я также чувствую, что, вероятно, я рассматриваю проблему не так, и, возможно, есть более чистое дизайнерское решение. У тебя есть какой-нибудь совет?

ответ

0

Если я правильно понимаю, вот одно решение:

  1. Создать два вида деятельности ActivityA и ActivityBC
  2. Создайте еще один фрагмент с радио-группы
  3. Вставить FragmentRadio в обоих ActivityA и ActivityBC
  4. Have что фрагмент начать новую деятельность на основе выбора во время завершения текущей деятельности
0

сделать поля, как это:

private static final String FRAGMENT_B_TAG = "fragmentB"; 

При добавлении фрагментов, использовать статические String сек как теги:

t.add(R.id.frame_list, fragmentB, FRAGMENT_B_TAG); 
t.add(R.id.frame_view, fragmentC, FRAGMENT_C_TAG); 

В вашей деятельности, настроить слушатель, который будет получать срабатывает каждый раз после вы звоните addToBackStack(String). Он узнает, какой фрагмент в настоящее время виден и скрыть/показать необходимые контейнеры.

getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     FragmentA fa = getSupportFragmentManager().findFragmentByTag(FRAGMENT_A_TAG); 
     FragmentB fb = getSupportFragmentManager().findFragmentByTag(FRAGMENT_B_TAG); 
     if (fa != null && fa.isVisible()) { 
      // Fragment A is visible, so hide the second container which is now empty 
     } 
     if (fb != null && fb.isVisible()) { 
      // Fragment B is visible, so show the second container 
     } 
    } 
}); 

Обратите внимание, что проверка является ли Fragment C видимым или нет не требуется, так как при Fragment B видна, Fragment C всегда видно тоже.

Это непроверенный код, но я думаю, он должен работать. Кроме того, если вам нужно какое-либо объяснение, не стесняйтесь спрашивать.

Надеюсь, это поможет.

Смежные вопросы