片段未显示在活动的顶部

时间:2014-08-31 14:07:36

标签: android android-fragments

当我将一个项目单击到我的操作栏中时,我想显示一个片段,在代码中我这样做:

    @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();
        [...]
       }

我不明白为什么没有显示。有人告诉我什么是错的?

提前感谢。

2 个答案:

答案 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。”