Android: Merge-Tag не работает с фрагментами

Я новичок в использовании фрагментов. Возможно ли иметь такой макет:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> <include layout="@layout/waiting_dialog"/> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_layout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@drawable/bg_tile" android:gravity="center_horizontal" android:orientation="vertical" android:visibility="invisible"> <include layout="@layout/no_entries"/> </LinearLayout> </merge> 

И использовать его во фрагментах onCreateView следующим образом:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { View view = inflater.inflate(R.layout.main, container, false); return view; } 

Всегда есть следующая ошибка:

 07-11 09:53:47.608: E/AndroidRuntime(5602): android.view.InflateException: \ <merge /> can be used only with a valid ViewGroup root and attachToRoot=true 

Как справиться с этой проблемой?

Видимо, как указано здесь, это невозможно.

То, что я сделал, вообще-то battery_details.xml «корневую компоновку» (см. battery_details.xml ). Поэтому я создаю макет фрагмента для моей MonitorActivity:

 public class MonitorActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_monitor); } } 

Где макет:

 <!-- activity_monitor.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MonitorActivity" > <fragment android:name="di.k23b.hw3.fragments.MonitorDetailsFragment" android:id="@+id/monitor_details" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="di.k23b.hw3.fragments.MonitorPrefsFragment" android:id="@+id/monitor_preferences" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout> 

И в классе MonitorDetailsFragment:

 public class MonitorDetailsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.battery_details, container, false); // NEVER TRUE ! } } 

Где battery_details.xml (созданный в res/layout ):

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/batteryTextHealth" android:layout_width="120dp" android:layout_height="wrap_content" android:ems="10" android:text="BATTERRRYYY" android:textIsSelectable="true" > </TextView> 

Работает. Так что, возможно, вы можете отредактировать макет, в котором вы используете фрагменты, добавьте <LinearLayout> и просто поместите элементы <LinearLayout> непосредственно в макет, который вы используете в OnCreateView – отбрасывая теги слияния

Я думаю, вы уже разместили свой фрагмент где-то в своей деятельности. (Правильно?) Вот почему он утверждал, что у него уже есть родитель.

Если вы действительно хотите его повторно использовать, вы должны отделить его от своего родителя в своей существующей иерархии представлений.

При раздувании макета, начинающегося с <merge /> , вы должны указать родительскую ViewGroup и вы также должны установить attachToRoot в true .