更换碎片时出现问题

时间:2013-12-27 09:46:08

标签: android android-fragments

我正在学习Fragments,我在使用transaction.replace方法时遇到了一些麻烦。我的示例应用程序有2个片段。列表片段和细节片段。他们应该像你期望的那样工作,你点击列表上的一个项目,它显示在细节片段中。这在双窗格格式中完美地工作,其中片段是并排的,当我点击新列表项时更新细节片段。如此: Dual pane format
我在单一位置视图中遇到问题,其中细节片段将替换列表片段。这没有发生,细节片段被覆盖在列表片段上。我正在使用transaction.replace()。这是一个截屏: enter image description here

这是(我认为是相关的)代码。如果您需要查看更多代码,请告诉我。

void showNote(long id){


    EditNoteFragment newNote = new EditNoteFragment();
    Bundle args = new Bundle();
    args.putLong("RowId", id);
    newNote.setArguments(args);
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    if(mDualPane)
    {
        Toast.makeText(getActivity(), "in double  pane" ,Toast.LENGTH_SHORT).show();
        transaction.replace(R.id.edit_note_fragment, newNote);
    }
    else
    {
        Toast.makeText(getActivity(), "in single  pane" ,Toast.LENGTH_SHORT).show();
        transaction.replace(R.id.notes_list_fragment, newNote);
        Fragment oldFragment = getFragmentManager().findFragmentById(R.id.notes_list_fragment);
        if(oldFragment != null)
            transaction.remove(oldFragment);


    }

    transaction.addToBackStack(null);
    transaction.commit();


}

layout / main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false">

 <fragment android:name="drkstr.yan.NotesListFragment"
          android:id="@+id/notes_list_fragment"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />
  </LinearLayout>

Layout-land / main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false">

 <fragment android:name="drkstr.yan.NotesListFragment"
          android:id="@+id/notes_list_fragment"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

 <fragment android:name="drkstr.yan.EditNoteFragment"
          android:id="@+id/edit_note_fragment"
          android:layout_weight="2"
          android:layout_width="0dp"
          android:layout_height="match_parent" />


  </LinearLayout>

任何帮助将不胜感激。 欢呼声

2 个答案:

答案 0 :(得分:1)

您可以在那里添加容器(例如,框架布局),而不是在布局中添加片段。 然后在代码中执行事务。 即,

transaction.replace(<container_id>, newNote);

这样做可以避免使用这些代码 -

 Fragment oldFragment = getFragmentManager().findFragmentById(R.id.notes_list_fragment);
        if(oldFragment != null)
            transaction.remove(oldFragment);

答案 1 :(得分:0)

错误在于您的transaction.replace(...)方法。第一个参数是要将新片段附加到的布局容器,而不是要替换的旧片段。所以试着用:

来调用它
transaction.replace(R.id.container, newNote);

但首先,将R.id.container添加到main_activity.xml

中的outter布局中