代码之家  ›  专栏  ›  技术社区  ›  Alaa AbuZarifa

将方法参数复制到最终temp变量无效

  •  -1
  • Alaa AbuZarifa  · 技术社区  · 7 年前

    所以我有一个初始化抽屉菜单的方法 Drawer 用于初始化抽屉的参数。现在,我尝试在单击抽屉项目后调用此抽屉参数来关闭它,但它给出了以下信息:

    Variable 'drawer' is accessed from within inner class, needs to be declare final

    所以我尝试手动分配 final 在参数旁边,它在初始化新抽屉的行中给出了此错误:

    Cannot assign a value to final variable 'drawer'

    因此,我让IDE自动修复第一个问题,并建议将“drawer”参数复制到最终的temp变量。有一次,没有显示错误,但当我运行该应用程序时,它崩溃了,并在我呼叫的线路上给我NPE drawer.close !!

    那么现在如何解决这个问题呢。。!

    代码:

    public void initDrawerMenu(Drawer drawer) {
    
        final Drawer finalDrawer = drawer; // the auto fix
        drawer = new DrawerBuilder()
            .withActivity(this)
            .withMultiSelect(false)
            .withOnDrawerItemClickListener(new OnDrawerItemClickListener() {
              @Override
              public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
    
                switch (position) {
    
                  case 0:
                    finalDrawer.closeDrawer(); // the finalDrawer = null hence causes NPE 
                    startActivity(new Intent(getApplicationContext(), HomeActivity.class));
                    break;
                }
                return true;
              }
            })
            .build();
      }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   ישו אוהב אותך Mahavir    7 年前

    那可能是因为你的抽屉在 initDrawerMenu 为null或在方法外部为null。

    如果要初始化抽屉,需要更改方法以返回抽屉,而不是将抽屉变量传递给方法。因此 initDrawerMenu 不依赖抽屉变量。

    根据您的代码,我认为您要做的是创建一个抽屉,而不是从现有抽屉初始化它。因此,您最好更改方法名称并使用return来创建抽屉。类似这样:

    public Drawer initDrawerMenu() {
      final Drawer drawer = new DrawerBuilder()
            .withActivity(this)
            .withMultiSelect(false)
            .withOnDrawerItemClickListener(new OnDrawerItemClickListener() {
              @Override
              public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
                switch (position) {
                  case 0:
                    drawer.closeDrawer(); 
                    startActivity(new Intent(getApplicationContext(), HomeActivity.class));
                    break;
                }
                return true;
              }
            })
            .build();
    
      return drawer;
    }
    

    您应该将方法名称更改为更具可读性,如下所示:

    public Drawer createDrawerMenu() {
      ...
    }
    

    当您想使用它时,只需使用以下命令调用它:

    Drawer drawer = createDrawerMenu();
    
        2
  •  0
  •   Deepak kaku    7 年前

    我使用了DrawerLayout和NavigationView。希望这有帮助

        public class MyActivity extends Activity implements OnNavigationItemSelectedListener{
    
         private DrawerLayout drawer;
    
         @Override
            public void onCreate(Bundle savedInstanceState) { 
                drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
         }
    
        @Override
            public boolean onNavigationItemSelected(MenuItem item) {
    
                 //close the drawer
                 drawer.closeDrawers();
                 switch (item.getItemId()) {
                    case R.id.item:
                    //do something
                    break;
                 }
        }
    }
    

    P、 S->此处R.id.item是一个菜单项

    您可以像这样将菜单设置为NavigationView

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true" >
    
        <android.support.design.widget.NavigationView
                android:id="@+id/navigation"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                app:menu="@menu/my_navigation_items" />
    
     </android.support.v4.widget.DrawerLayout>