2013-07-18 3 views
4

Я пытаюсь поместить 2 фрагмента внутри фрагмента. Я нашел некоторый код в Интернете, но, насколько я мог, мне не удалось разместить 2 фрагмента в 1 фрагменте. Я видел подсказки, касающиеся FragmentManager и особенно метода getChildFragmentManager(), но я не знаю, как это работает с 2 фрагментами.Фрагменты внутри фрагмента Приложения для Android

Для истории я использую действие с ActionBar, которое создает 3 фрагмента. В одном из них мне нужно обработать график и своеобразное меню, чтобы изменить масштаб графика. Таким образом, мне нужно 2 фрагмента в одном фрагменте.

Вот код:

фрагмент, который обрабатывает другие:

public class GraphDisplayFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 

    View myFragmentView = inflater.inflate(R.layout.graph_fragment, container, false); 

    return myFragmentView; 

} 
} 

Код, чтобы нарисовать график:

public class GraphFragment extends Fragment { 
private static final int SERIES_NR = 1; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 

    GraphicalView myFragmentView = ChartFactory.getTimeChartView(this.getActivity(), getDateDemoDataset(), getDemoRenderer(),null); 
    return myFragmentView; 

} 

//some functions to set graph propreties 
} 

XML-файлы:

graph_fragment .xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 
<fragment 
    android:id="@+id/graph_fragment" 
    android:name="com.test.GraphFragment" 
    android:layout_width="match_parent" 
    android:layout_height="259dp" > 

</fragment> 
<fragment 
    android:name="com.test.GraphDetailFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/graph_detail_fragment"> 
</fragment> 
</LinearLayout> 

graph_detail.xml с тестовым реализации

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 
<TextView 
    android:id="@+id/textView1" 
    android:layout_width="211dp" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 
</LinearLayout> 

Странная вещь, она работает в начале, когда я переключаюсь между фрагментами в ActionBar, но после 3-4 ходов, я получаю эту ошибку:

android.view.InflateException: Binary XML file line #7: Error inflating class fragment 

Если у кого-то есть решение, было бы замечательно!

+0

см http://stackoverflow.com/a/11020531/1219456 –

+0

возможный дубликат [фрагментов в осколках] (http://stackoverflow.com/questions/6847460/fragments-within-fragments) – rds

ответ

0

Вы можете попробовать использовать метод * findFragmentById (fragment_id) * from SupportFragmentManager, чтобы получить экземпляр фрагмента из вашего XML-файла и вставить там свой фрагмент.

Что-то вроде:

Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.myFragmentId); 

Я надеюсь, чтобы помочь вам.

С уважением. Адриано

2

Так первый прочь изменить XML для graph_fragment.xml к этому

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <FrameLayout 
      android:id="@+id/graph_fragment_holder" 
      android:layout_width="match_parent" 
      android:layout_height="259dp" > 

    </FrameLayout> 
    <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/graph_detail_fragment_holder"> 
    </FrameLayout> 
</LinearLayout> 

Затем в коде, чтобы раздуть их от использования фрагмента что-то вроде этого

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.graph_fragment, 
      container, false); 
    FirstChildFragment frag1 = (FirstChildFragment) getChildFragmentManager() 
      .findFragmentById(R.id.first_frag_layout); 
    SecondChildFragment frag1 = (SecondChildFragment) getChildFragmentManager() 
      .findFragmentById(R.id.second_frag_layout); 
    if (null == frag1) { 
     FirstChildFragment = new frag1(); 
     FragmentTransaction transaction = getChildFragmentManager() 
       .beginTransaction(); 

     transaction.add(R.id.graph_fragment_holder, frag1) 
       .addToBackStack(null).commit(); 
    } 

    if (null == frag2) { 
     SecondChildFragment = new frag2(); 
     FragmentTransaction transaction = getChildFragmentManager() 
       .beginTransaction(); 

     transaction.add(R.id.graph_detail_fragment_holder, frag2) 
       .addToBackStack(null).commit(); 
    } 

    return rootView; 
} 
+0

если ваш язь говорит, что не может найти метод getChildFragmentManager, не волнуйтесь, он все равно будет компилироваться и работать плавно. – SemaphoreMetaphor

+0

Спасибо за ваш ответ. Я попробовал, но я не знаю, что вы подразумеваете под 'FirstChildFragment = new frag1();' поэтому я попытался с помощью 'FirstChildFragment frag = frag1;', и я получаю сообщение об ошибке при переключении между фрагментами в ActionBar: 'java. яз.NullPointerException at android.support.v4.app.BackStackRecord.doAddOp (BackStackRecord.java:394) ' –

+0

Вот где вы помещаете имена ваших фрагментов. Вам также необходимо заполнить для них правильные имена макетов. Надеюсь, что это очистит – SemaphoreMetaphor

1

MyFragment myFragment = (MyFragment .) getChildFragmentManager() findFragmentById (R.id.my_fragment);

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