Android新手疑问:setNavigationItemSelectedListener(this)中this指代什么?
嘿,作为Android新手遇到这种this的困惑真的太常见了,我来给你掰扯明白!
1. 先明确this在这里的核心指代
你这段代码应该是写在你的Activity类(比如MainActivity)里面的,这里的this指的就是当前的Activity实例。但有个关键前提:你的Activity必须已经实现了NavigationView.OnNavigationItemSelectedListener接口,不然navigationView.setNavigationItemSelectedListener(this)这句代码会直接报错。
你可以看看你的Activity类声明,应该是类似这样的:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { // ... 你的其他代码 ... }
2. 为什么替换其他对象会失效?
navigationView.setNavigationItemSelectedListener()方法要求传入的参数必须是NavigationView.OnNavigationItemSelectedListener类型的实例。只有你的Activity实现了这个接口,this才符合参数类型要求。
如果换成其他对象(比如随便new一个无关的类实例),因为它们没有实现这个监听接口,自然无法触发导航菜单的点击事件。
3. 配套的必要代码
既然用了this作为监听,你的Activity里肯定还有重写的onNavigationItemSelected方法,用来处理导航菜单项的点击逻辑,比如:
@Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // 根据点击的菜单项ID处理逻辑 int id = item.getItemId(); if (id == R.id.nav_home) { // 跳转到首页逻辑 } else if (id == R.id.nav_profile) { // 跳转到个人资料页逻辑 } // 关闭侧边栏 DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }
4. 顺便说下ActionBarDrawerToggle里的this
同样的,ActionBarDrawerToggle构造函数的第一个参数需要Activity类型的实例,你的Activity继承自AppCompatActivity(本身就是Activity的子类),所以这里的this也是指当前Activity实例,用来关联侧边栏和ActionBar的切换逻辑。
总结
简单来说,这里的this就是你写这段代码的Activity本身,而且这个Activity必须实现了对应的监听接口,才能作为参数传递给setNavigationItemSelectedListener。这也是Google Codelab里这么写的原因——既简洁又符合Android组件的设计规范。
内容的提问来源于stack exchange,提问作者user7152628

