向FrameLayout添加新片段会产生IllegalStateException

时间:2013-11-27 05:28:06

标签: java android android-fragments

我正在尝试在我正在尝试创建的应用中实现导航抽屉。目前,每个Activity的内容都显示在Fragment内。由于我无法在布局中使用静态<fragment />,因此我选择使用虚拟<FrameLayout />。这是我的布局:

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawerLayout_messages"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- Main content view -->
<FrameLayout
    android:id="@+id/messages_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- Drawer view -->
<ListView
    android:id="@+id/messages_drawer_list"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#F0F0F0"/>

</android.support.v4.widget.DrawerLayout>

现在,当尝试用片段替换<FrameLayout />时,我想这个错误:

  

java.lang.IllegalStateException:指定的子节点已经有了   家长。您必须首先在孩子的父母身上调用removeView()。

这是我正在执行的代码,以便添加片段:

public class MessagesActivity extends Activity {
    public static final String TAG = Constants.PACKAGE + ".MessagesActivity";

    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle drawerToggle;
    private ListView drawerItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "Starting activity: " + TAG);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messages);

        drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout_messages);
        String[] drawerItemsList = getResources().getStringArray(R.array.drawer_items);
        drawerItems = (ListView) findViewById(R.id.messages_drawer_list);
        drawerItems.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, drawerItemsList));

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
        drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.title_app, R.string.title_messages) {

            public void onDrawerClosed(View view) {
                getActionBar().setTitle(R.string.title_messages);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View view) {
                getActionBar().setTitle(R.string.title_app);
                invalidateOptionsMenu();
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);

        if (savedInstanceState == null) {
            Log.d(TAG, "Setting fragment");
            setFragment(0);
        }

        Log.d(TAG, TAG + "'s layout is initialized. Now starting service connection");
    }

    public void setFragment(int position) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        transaction.replace(R.id.messages_content, new MessagesFragment());
        transaction.addToBackStack(null);
        transaction.commit();

        drawerItems.setItemChecked(position, true);
        drawerLayout.closeDrawer(drawerItems);
    }
}

Activity文件基本上是直接从Google的开发者资源中提取的,但我仍然收到错误消息。我忘了做某事吗?

编辑:为您添加了我的MessagesFragment代码。

public class MessagesFragment extends Fragment {

    public MessagesFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_messages, container);
    }
}

1 个答案:

答案 0 :(得分:2)

return inflater.inflate(R.layout.fragment_messages, null);

请你尝试使用null而不是容器。