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,听众可能会感到混乱。