尝试使用 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中添加组件。
切换 →
如果您使用的是基于 View 的布局,则有三种主要选择来实现切换开关。我们建议使用
SwitchMaterial组件
来自 Material
Components 库:
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> android:id="@+id/material_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/material_switch" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
旧版应用可能仍在使用较旧的
SwitchCompat AppCompat
组件,如以下示例所示:
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> android:id="@+id/switchcompat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/switchcompat" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
以下示例展示了
AppCompatToggleButton,这是另一个旧版组件,其界面明显不同:
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> android:id="@+id/toggle_button_label" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/toggle" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintBaseline_toBaselineOf="@id/toggle" android:text="@string/toggle_button" /> android:id="@+id/toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/toggle_button_label" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/>
这三个组件提供相同的行为,但外观不同。SwitchMaterial 和 SwitchCompat 之间的差异很小,但
AppCompatToggleButton 明显不同:
图 1. 三种切换开关按钮类型。
处理状态更改
SwitchMaterial、SwitchCompat 和 AppCompatToggleButton 都是 CompoundButton 的子类,这为它们提供了一种用于处理选中状态更改的通用机制。您可以实现
的实例并将其添加到按钮,如以下示例所示:CompoundButton.OnCheckedChangeListener
Kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: SwitchLayoutBinding = SwitchLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.materialSwitch.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
// The switch is checked.
} else {
// The switch isn't checked.
}
}
}
}
Java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SwitchLayoutBinding binding = SwitchLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.materialSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
// The switch is checked.
} else {
// The switch isn't checked.
}
});
}
}
CompoundButton.OnCheckedChangeListener 是一个单一抽象方法接口(或 SAM 接口 ),因此您可以将其实现为
lambda。每当选中状态发生变化时,系统都会调用 lambda,并且传递给 lambda 的 isChecked 布尔值表示新的选中状态。