谷歌搜索我看到许多声明嵌套片段不能使用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;
}
}
答案 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问题。