4

我正在尝试将 2 个片段放入一个片段中。我在互联网上找到了一些代码,但据我所知,我没有成功将 2 个片段放入 1 个片段中。我已经看到了处理 FragmentManager 的技巧,尤其是方法 getChildFragmentManager() 但我不知道它如何处理 2 个片段。

对于这个故事,我使用了一个带有 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

如果有人有解决方案,那就太棒了!

4

3 回答 3

2

因此,首先将graph_fragment.xml 的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;
}
于 2013-07-18T14:44:24.300 回答
1

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

于 2015-07-10T13:25:47.860 回答
0

您可以尝试使用SupportFragmentManager中的 *findFragmentById(fragment_id)* 方法从 .xml 文件中获取片段实例并将片段插入其中。

就像是:

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

我希望能帮助你。

此致。阿德里亚诺

于 2013-07-18T14:17:20.310 回答