当我将一个项目单击到我的操作栏中时,我想显示一个片段,在代码中我这样做:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.create_boundary:
Fragment boundary = new BoundaryFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.map_activity, boundary);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
break;
}
}
和片段:
public class BoundaryFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create the view of the fragment associate with the maps activity
View view = inflater.inflate(R.layout.boundary_maps, container, false);
return view;
}
片段的布局:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</GridLayout>
activity_map.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map_activity"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
</RelativeLayout>
onCreate of mapsActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
[...]
}
我不明白为什么没有显示。有人告诉我什么是错的?
提前感谢。
答案 0 :(得分:2)
正如FragmentTransaction.replace(int,Fragment,String)的官方文档中所述:
<强>参数强>
-containerViewId
其容器的标识符 片段将被替换 -fragment
要放入的新片段 容器。
-tag
片段的可选标记名称,以便日后使用 使用FragmentManager.findFragmentByTag(String)
检索片段。
这意味着您错误地使用了交易中的id
。另外,您可能希望在XML布局中定义的BoundaryFragment
之上添加id
,因此您应该使用FragmentTrasaction.add(int, Fragment)代替。
无论如何要解决您的问题,您应该将RelativeLayout
移至<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map_activity"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
</RelativeLayout>
,如下所示:
{{1}}
答案 1 :(得分:1)
首先,您正在使用Fragment,因为它将是ViewGroup。当你执行下一个语句时,你正试图将Fragment放在另一个Fragment中:
ft.replace(R.id.map_activity, boundary);
其次,您无法替换布局文件中定义的片段。您只能替换使用FragmentTransaction动态添加的片段。
要获得您想要的内容,take a look位于以下部分的示例代码中: “或者,以编程方式将片段添加到现有ViewGroup。”