Kotlin Android开发疑问:supportActionBar变量的来源是什么?
问题
我正在学习Kotlin的Android开发,跟着教程制作Toolbar功能:先在布局XML文件中创建Toolbar,再调用AppCompatActivity类的setSupportActionBar()方法关联它。之后使用supportActionBar.setNavigationOnClickListener{}时产生困惑:这个supportActionBar并未在代码中定义,IDE提示它对应getSupportActionBar(),但我找不到该变量的定义,也未在文档中查到相关说明。
我之前学过Java,原本以为需要自行定义var supportActionBar = getSupportActionBar(),但教程中直接使用了该“变量”,怀疑这是Kotlin的特性导致,希望了解它的来历。
相关代码如下:
ExerciseActivity.kt
package com.example.a7minutesworkout import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.a7minutesworkout.databinding.ActivityExerciseBinding import com.example.a7minutesworkout.databinding.ActivityMainBinding class ExerciseActivity : AppCompatActivity() { private var binding : ActivityExerciseBinding? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityExerciseBinding.inflate(layoutInflater) setContentView(binding?.root) setSupportActionBar(binding?.toolbarExercise) if(supportActionBar != null){ supportActionBar?.setDisplayHomeAsUpEnabled(true) } binding?.toolbarExercise?.setNavigationOnClickListener { onBackPressed() } }}
布局文件activity_exercise.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ExerciseActivity"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbarExercise" android:layout_width="match_parent" android:theme="@style/ToolbarTheme" android:layout_height="?android:attr/actionBarSize" android:background="@color/white" app:titleTextColor="@color/colorPrimary"/> </RelativeLayout>
解答
这是Kotlin针对Java代码的属性访问语法糖,核心逻辑如下:
AppCompatActivity是Java编写的类,其中定义了getSupportActionBar()这个Getter方法,符合JavaBean规范(方法名以get开头,返回对应组件实例)。- Kotlin为了简化Java代码的调用,自动将这类符合规范的Getter方法映射为同名属性。也就是说,你直接写
supportActionBar,本质上就是在调用getSupportActionBar(),完全不需要自己额外定义变量。
举个直观的对应例子:
- Java写法:
ActionBar actionBar = getSupportActionBar(); - Kotlin写法:
val actionBar = supportActionBar
这种特性是Kotlin与Java互操作性的核心设计之一,目的是让代码更简洁,避免重复编写Getter/Setter方法调用。
内容的提问来源于stack exchange,提问作者W Simm
相关产品推荐
相关产品推荐

