Android 方向更改时的NullPointerException

Android 方向更改时的NullPointerException,android,view,drawerlayout,Android,View,Drawerlayout,我正在一个新项目中实施新的DrawerLayout。我的代码几乎是从抽屉布局指南中一字不差地找到的,直到我改变方向。方向更改时发生的情况是,通过findViewById设置的任何视图都返回null。在下面的代码中,mDrawerList和mDrawerLayout在方向更改时均为空,但在首次打开活动时不为空 我检查null值以防止出现NullPointerException,但我在LogCat中收到另一个警告: 05-22 20:56:08.375: W/PhoneWindow(16528):

我正在一个新项目中实施新的
DrawerLayout
。我的代码几乎是从
抽屉布局
指南中一字不差地找到的,直到我改变方向。方向更改时发生的情况是,通过
findViewById
设置的任何视图都返回null。在下面的代码中,
mDrawerList
mDrawerLayout
在方向更改时均为空,但在首次打开活动时不为空

我检查null值以防止出现
NullPointerException
,但我在LogCat中收到另一个警告:

05-22 20:56:08.375: W/PhoneWindow(16528): Previously focused view reported id 2130968626 during save, but can't be found during restore.
活动现在已加载,但抽屉布局将不再像以前那样从左侧滑出。这里怎么了

这是我的onCreate调用的方法

public void initializeDrawer() {

    // Get list of menu items from array resource
    mDrawerItems = getResources().getStringArray(R.array.nav_drawer_items);

    if (mDrawerList == null)
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

    // Set the adapter for the listview
    mDrawerList.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, mDrawerItems));

    // Set the lists click listener
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // Set up the action bar toggle listener to get the draw moving
    if (mDrawerLayout == null)
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to
                                        //     onPrepareOptionsMenu()
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to
                                        //     onPrepareOptionsMenu()
        }
    };

    // Attach the listener
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

}
public void initializeDrawer(){
//从阵列资源获取菜单项列表
mDrawerItems=getResources().getStringArray(R.array.nav\u抽屉\u项目);
if(mDrawerList==null)
mDrawerList=(ListView)findViewById(R.id.left\u抽屉);
//设置listview的适配器
mDrawerList.setAdapter(新阵列适配器,
R.layout.drawer_list_item,mDrawerItems);
//设置列表,单击listener
setOnItemClickListener(新的DrawerItemClickListener());
//设置动作栏切换侦听器以使绘图移动
if(mDrawerLayout==null)
mDrawerLayout=(抽屉布局)findViewById(R.id.抽屉布局);
mDrawerToggle=新操作BarDrawerToggle(此,mDrawerLayout,
R.drawable.ic_抽屉,R.string.drawer_抽屉打开,
右弦抽屉(U关闭){
/**当抽屉处于完全关闭状态时调用*/
公共无效onDrawerClosed(视图){
getActionBar().setTitle(mTitle);
InvalidateOptions菜单();//创建对的调用
//onPrepareOptions菜单()
}
/**当抽屉处于完全打开状态时调用*/
打开图纸上的公共空白(视图抽屉视图){
getActionBar().setTitle(mDrawerTitle);
InvalidateOptions菜单();//创建对的调用
//onPrepareOptions菜单()
}
};
//附加侦听器
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}

对我来说,initializeDrawer()被调用两次听起来很奇怪

如果该方法在超类中,那么应该仅通过onCreate在那里调用它。为什么子类再次调用initializeDrawer(它应该只调用super(),super()反过来调用initializeDrawer)


您的问题可能是由于您两次调用InitializedRaver时侦听器出错造成的。

尝试将以下内容添加到您的
活动中

    @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

更改方向时,您的活动将被销毁并重新创建。是否在onCreate()中重新初始化,例如mDrawerList?您好,如上所述,在onCreate()中调用了initializeDrawer()方法对不起,没有读到。但如果是这样,为什么要进行空检查?mDrawerList和mDrawerLayout在任何情况下都应为null,而不仅仅是在重新定向时。或者您也在其他地方初始化它们吗?我添加了null检查,因为在调试中,mDrawerList在运行赋值行之前不为null。它运行onCreate两次,因为initializeDrawer()中的实际代码位于我的活动继承自的超类中。我不确定这是否有助于解决实际问题,但initializeDrawer()调用两次听起来很奇怪。如果该方法在超类中,那么应该仅在那里通过onCreate调用它,对吗?为什么子类再次调用initializeDrawer(它应该只调用super(),super()反过来调用initializeDrawer)。同样,我不确定这是否有帮助,但如果你两次调用InitializedRaver,听众可能会感到混乱。