2012-07-11 45 views
4

我是使用片段的初学者。是否有可能有这样的布局: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 

如何处理这个问题?

回答

0

我想你已经把你的片段放在你的活动的某个地方。 (对吗?) 这就是为什么他声称已经有一位家长。

如果您确实想要重用它,那么您必须将其从其父视图的现有视图层次结构中分离出来。

当充气开始用<merge />布局,必须指定一个父ViewGroup,你还必须设置attachToRoottrue

3

显然如所述here这是不可能的。

我所做的完全放弃了“根布局”(参见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中使用的布局中 - 删除合并标记