为什么嵌套的Fragments不能使用XML?

时间:2013-07-19 02:06:24

标签: android-fragments android-nested-fragment android-radiobutton

谷歌搜索我看到许多声明嵌套片段不能使用XML。现在我是Android新手,但我的应用程序正在使用带有嵌套片段的XML。我还没有听众和界面工作(也许这就是为什么人们说你不能使用XML),但GUI工作。

我的问题:我读过的关于不使用XML嵌套片段的评论是什么意思?

此处a link对一个陈述XML不能与嵌套片段一起使用:

下面的代码在水平排列在顶部(在另一个片段中)创建3个放射性组(每个在片段中),在它们下面有一个列表视图(在另一个片段中)。这些片段可以很好地控制不同显示类型的外观。

这是我的代码:

public class SetupNew extends Activity {  
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ngs);   
}}

ngs.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<fragment android:id="@+id/frag_options_all"
          android:layout_height="250dp"              
          android:layout_width="fill_parent"
          android:layout_marginLeft="5dp"
          android:layout_marginRight="5dp"
          android:name="com.EXAMPLE.frag_class_options_all"/>
<fragment android:id="@+id/frag_select_opponent"
          android:layout_height="fill_parent"
          android:layout_marginLeft="5dp"
          android:layout_marginTop="10dp"
          android:layout_width="fill_parent"
          android:name="com.EXAMPLE.frag_class_opponents"/>
</LinearLayout>

frag_class_options_all.java

    public class frag_class_options_all extends Fragment {
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.options_all, container, false);
      return view;
  }}

frag_class_opponents.java

public class frag_class_opponents extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {  
    //working contact listview
}

options_all.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<fragment android:id="@+id/frag_options"
          android:layout_height="fill_parent"              
          android:layout_width="80dp"
          android:layout_marginRight="15dp"
          android:name="com.EXAMPLE.frag_class_options"/>
<fragment android:id="@+id/frag_ship_limit"
          android:layout_height="fill_parent"              
          android:layout_width="75dp"
          android:layout_marginRight="15dp"
          android:name="com.EXAMPLE.frag_class_limit_options"/>
<fragment android:id="@+id/frag_allowable_ship"
          android:layout_height="fill_parent"              
          android:layout_width="fill_parent"
          android:name="com.EXAMPLE.frag_class_allow"/>
</LinearLayout>

frag_class_options frag_class_limit_options frag_class_allow 都遵循以下内容:

public class frag_class_options extends Fragment{
RadioGroup radioGroup;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.options_m, container, false);

    radioGroup = (RadioGroup) view.findViewById(R.id.rg_limit);     
    return view;
}     
}

3 个答案:

答案 0 :(得分:3)

要嵌套片段,必须使用片段的getChildFragmentManager方法。 XML中片段的默认XML实现使用Activity的getFragmentManager导致错误。由于只能通过Java代码访问childFragmentManager,因此您无法使用XML来嵌套片段

查看更多信息:http://developer.android.com/about/versions/android-4.2.html#NestedFragments

答案 1 :(得分:2)

这个Duplicate id bug就是你不应该在xml中声明嵌套片段的原因。

在android中并不禁止在xml中声明嵌套片段,只要你不破坏片段并尝试重新创建它(它发生在fragmentManager.replace内部)就可以工作了。例如,如果你有一个导航抽屉和执行以下操作:

fragManager.replace(containerId, new fragmentOne()); fragManager.replace(containerId, new fragmentTwo());

fragManager.replace(containerId, new fragmentOne());

第3次替换可能会因重复的id bug而崩溃。我不知道为什么会这样,但我可以向你保证,这非常令人沮丧!我个人希望嵌套片段在xml中完全失败而不是部分工作!

答案 2 :(得分:-1)

  

我的问题:我读过的关于不使用XML嵌套片段的评论是什么意思?

答案:我不知道。你没有告诉我们你在哪里发现这些评论,所以我们没有什么可继续的。也许评论的作者定义了他的术语“嵌套片段”的意思,也许他没有。它不是标准的XML术语,我无法猜测它对你的问题意味着什么。我在XML示例中看到了名为“fragment”的元素,但它们没有嵌套。

也许这个问题对于android非常具体,在这种情况下你不应该把它标记为一般的XML问题。