导航抽屉片段保持返回null

时间:2015-09-29 08:12:46

标签: android xml android-fragments android-resources android-navigation-drawer

我在配置应用程序时遇到了麻烦,因此在启动时不会崩溃。我创建了一些活动并创建了一个导航抽屉片段,其布局我存储在一个单独的.xml文件中,并将其包含在每个活动的布局中。

这是有效的,直到我为一个不是启动器活动的活动玩了一个不同的.xml文件。 gradle构建中存在一个错误,即加载到手机上的应用程序是以前的版本(由于某些原因,我所做的更改未包含在构建中)。这通常适用于我(在Android Studio中),我的工作是从手机中卸载应用程序并通过在Android Studio中运行来重新安装。但是在这之后,我得到了一些奇怪的结果。现在我甚至无法启动我的Android应用程序。

当代码尝试

时,我收到空指针错误
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference

如果用户第一次打开应用程序,它崩溃的行是它试图打开抽屉的行,它似乎是容器视图变为空:

public void setUp(int fragmentID, final DrawerLayout drawerLayout, Toolbar toolbar){
     mDrawerLayout = drawerLayout;
    containerView = getActivity().findViewById(fragmentID);    

    if(!mUserLearnedDrawer && !mFromSavedInstanceState){
        mDrawerLayout.openDrawer(containerView);
    }

}

在我的MainActivity中调用此设置函数(在OnCreate方法中):

NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.drawer_layout_declared);
drawerFragment.setUp(R.id.drawer_layout_declared, (DrawerLayout) findViewById(R.id.drawer_layout_home), toolbar);

现在我将导航抽屉包括在我的布局文件中。

<include
    android:id="@+id/nav_drawer_frag"
    layout="@layout/navigation_drawer_declaration"/>

它是android.support.v4.widget.DrawerLayout元素的第二个子元素 这是navigation_drawer_declaration.xml文件的内容。

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout_declared"
    android:name="helloworld.vault101payroll.NavigationDrawerFragment"
    android:layout_width="@dimen/nav_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:layout="@layout/fragment_navigation_drawer"
    tools:layout="@layout/fragment_navigation_drawer"/>

我相信这是为fragmentID添加导航抽屉时应该引用的内容。

我已将资源文件的值记录为2131492942,这是非空布局的值整数吗?

无论如何,我认为这个错误是如何产生的,因为我正在处理一个完全不相关的代码片段以发生错误。我删除了自上次应用程序运行以来我正在处理的文件,它没有任何区别。

非常感谢任何帮助。

修改

请注意,我已将ActionBarDrawerToggle对象添加到抽屉切换: 这就是我的

containerView = getActivity().findViewById(fragmentID)

mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_closed){

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if(!mUserLearnedDrawer){
                mUserLearnedDrawer = true;
                saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + "");
            }
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }
    };
    if(!mUserLearnedDrawer && !mFromSavedInstanceState){
        mDrawerLayout.openDrawer(containerView);
    }
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

1 个答案:

答案 0 :(得分:1)

在“containerView = getActivity()。findViewById(fragmentID);”下添加代码。“这将定义drawerLayout的行为。

mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar,
            R.string.drawer_open, R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!mUserLearnedDrawer) {
                mUserLearnedDrawer = true;
                saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + "");
            }
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });