Android 导航抽屉片段一直返回null
我在配置我的应用程序以使其在启动时不会崩溃方面遇到问题。我创建了一些活动并制作了一个导航抽屉片段,我将其布局存储在一个单独的.xml文件中,并将其包含在每个活动的布局中 这是可行的,直到我为一个活动使用了另一个.xml文件,而不是启动器活动。gradle版本中存在一个bug,因此加载到手机上的应用程序是以前的版本(出于某种原因,我所做的更改没有包含在版本中)。这种情况经常发生在我身上(在Android Studio中),我的工作就是从手机上卸载应用程序,然后在Android Studio中运行重新安装。然而,在这样做之后,我得到了一些奇怪的结果。现在我甚至无法启动我的android应用程序 当代码试图Android 导航抽屉片段一直返回null,android,xml,android-fragments,android-resources,navigation-drawer,Android,Xml,Android Fragments,Android Resources,Navigation Drawer,我在配置我的应用程序以使其在启动时不会崩溃方面遇到问题。我创建了一些活动并制作了一个导航抽屉片段,我将其布局存储在一个单独的.xml文件中,并将其包含在每个活动的布局中 这是可行的,直到我为一个活动使用了另一个.xml文件,而不是启动器活动。gradle版本中存在一个bug,因此加载到手机上的应用程序是以前的版本(出于某种原因,我所做的更改没有包含在版本中)。这种情况经常发生在我身上(在Android Studio中),我的工作就是从手机上卸载应用程序,然后在Android Studio中运行重
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference
当用户第一次打开应用程序时,它会尝试打开抽屉,而崩溃的那一行似乎是正在变为空的containerView:
public void setUp(int fragmentID, final DrawerLayout drawerLayout, Toolbar toolbar){
mDrawerLayout = drawerLayout;
containerView = getActivity().findViewById(fragmentID);
if(!mUserLearnedDrawer && !mFromSavedInstanceState){
mDrawerLayout.openDrawer(containerView);
}
}
此设置函数在my MainActivity(OnCreate方法)中调用:
现在,我在布局文件中包含了导航抽屉,如下所示
<include
android:id="@+id/nav_drawer_frag"
layout="@layout/navigation_drawer_declaration"/>
线
在“containerView=getActivity().findViewById(fragmentID);”下面添加该代码,该代码将定义抽屉布局的行为
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();
}
});
我的导航抽屉片段类中已经有了这些代码。我只是没有把它放在我的开场白里,因为我不想让帖子超载。干杯,然后您需要重新检查您所使用的视图是否已定义(使用findviewbyd),您可能没有定义。如果无法解决问题,请告诉我。是否有明确的方法检查此问题?我使用Android Studio的autocomplete来完成R.id.***,直接从片段复制并粘贴id,并记录片段布局的值。containerView仍然返回为空。:)没有(至少据我所知)。
<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"/>
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();
}
});
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();
}
});