我在配置应用程序时遇到了麻烦,因此在启动时不会崩溃。我创建了一些活动并创建了一个导航抽屉片段,其布局我存储在一个单独的.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();
}
});
答案 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();
}
});