Android 如何使开关控件显示它';s";打开";或;关闭“;?
假设我有一个控制android服务的开关: 当交换机处于“开启”状态时,表示服务正在运行, 当开关处于“关闭”位置时,表示服务未运行。 此外,当用户点击开关时,它应该切换服务 (因此切换交换机的显示状态,因为如前所述,交换机的显示状态正在跟踪服务的状态) 方法#1:为开关提供一个打开或关闭服务的Android 如何使开关控件显示它';s";打开";或;关闭“;?,android,user-experience,Android,User Experience,假设我有一个控制android服务的开关: 当交换机处于“开启”状态时,表示服务正在运行, 当开关处于“关闭”位置时,表示服务未运行。 此外,当用户点击开关时,它应该切换服务 (因此切换交换机的显示状态,因为如前所述,交换机的显示状态正在跟踪服务的状态) 方法#1:为开关提供一个打开或关闭服务的onCheckedChanged侦听器 取决于新选中的状态 我不喜欢方法1,因为当用户点击开关打开服务时, 我不想让它看起来像是开着的直到服务真正开始, 这可能不是立即的 (它可能根本无法成功启动,但为了
onCheckedChanged
侦听器
取决于新选中的状态
我不喜欢方法1,因为当用户点击开关打开服务时,
我不想让它看起来像是开着的直到服务真正开始,
这可能不是立即的
(它可能根本无法成功启动,但为了简单起见,我将忽略这种可能性)。
同样,当用户关闭服务时,我不希望开关看起来像关闭了一样
直到服务真正关闭
方法2:在不改变显示状态的情况下点击开关切换服务,
并且仅在通知服务已成功启动或关闭时切换显示状态
我也不喜欢方法2(即使我知道如何实现它),因为用户没有得到
立即反馈该水龙头已被识别,
而且,如果服务没有成功地改变状态,那么就没有任何反馈。我认为那很糟糕。< /P>
方法#3:使其如此:点击开关立即切换拇指位置,但不切换颜色
和切换服务,并使交换机的颜色跟踪服务的实际状态。
因此,相对于拇指位置的变化,颜色变化可能会延迟
这意味着开关将有4种可能的视觉状态,而不是2种:
- “关闭”(拇指关闭,颜色关闭)
- “打开”(拇指打开,颜色关闭)
- “打开”(拇指打开,颜色打开)
- “关闭”(拇指关闭,颜色打开)
- 一个
监听器,允许拇指改变位置 和往常一样,但这会将开关的颜色设置为与通常相反的颜色 (这样它就不会改变颜色),并切换服务onCheckedChanged
- 用于通知服务已启动或关闭的侦听器, 它独立于拇指位置设置开关的颜色 (虽然它也可能改变拇指的位置, 如果服务因外力而上升或下降, 因为我们想让开关跟踪它)
setTint()
,setTintList()
,setTintMode()
。但我不确定电话会是什么
我也欢迎任何其他关于如何制作开关的好主意,立即给出“打开”或“关闭”的反馈,而不立即显示为“打开”或“关闭”。我有点喜欢你的想法。我想
settinlist
会是你的朋友
您要做的是这样的:
int[][] states = new int[][] {
new int[] {-android.R.attr.state_checked},
new int[] {android.R.attr.state_checked},
};
int[] thumbColors = new int[] {
Color.LIGHTBLUE,
Color.BLUE,
};
int[] trackColors = new int[] {
Color.YELLOW,
Color.RED,
};
DrawableCompat.setTintList(DrawableCompat.wrap(yourSwitchCompatView.getThumbDrawable()), new ColorStateList(states, thumbColors));
DrawableCompat.setTintList(DrawableCompat.wrap(yourSwitchCompatView.getTrackDrawable()), new ColorStateList(states, trackColors));
使用此代码,您可以通过编程方式调整拇指/轨迹颜色。您需要为每个不同的状态设置不同的颜色(如您所述)。根据收到的状态/回调,您希望相应地更改颜色。它应该是这样工作的
另一个想法可以是:
- 开关已停用
- 分接开关
- 用负载指示器/旋转器更换开关
- 回调成功时:显示活动微调器
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.v7.widget.SwitchCompat
android:id="@+id/sw_compat"
android:layout_width="100dp"
android:layout_height="50dp"
android:checked="false"
/>
<LinearLayout
android:id="@+id/ll_touch_interceptor"
android:layout_width="100dp"
android:layout_height="50dp"
android:orientation="vertical">
</LinearLayout>
</FrameLayout>
您可以通过获取三个布尔变量来实现这一点。1) 检查服务是否正在运行的状态。2) 检查用户是否与交换机交互。3) 更改交换机的状态。谢谢,这让我开始了。set{Thumb,Track}TintList()也可以工作(api级别>=23)。你知道如何找到合适的颜色来使用吗?我不想硬编码新的颜色;我只想保留现有的颜色,从默认值或当前主题或任何东西。我希望对mySwitch.get{Thumb,Track}TintList()的初始调用会告诉我,但不幸的是,它们最初返回null。
sw_compat= (Switch) findViewById(R.id.sw_compat);
ll_touch_interceptor= (LinearLayout) findViewById(R.id.ll_touch_interceptor);
ll_touch_interceptor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressDialog dialog = new ProgressDialog(DummyDialog.this);
if (sw_compat.isChecked())
{
dialog.setMessage("Demolishing service");
dialog.show();
//write code to initiate service / operation
//whenever you got feedback that service got successfully initiated then check the switch
if (service_successfully_disabled) {
dialog.dismiss();
sw_compat.setChecked(false);
}
else
{
Toast.makeText(DummyDialog.this, "Sorry! Failed to stop service", Toast.LENGTH_SHORT).show();
}
}
else
{
dialog.setMessage("Initiating service");
dialog.show();
if (service_successfully_enabled) {
dialog.dismiss();
sw_compat.setChecked(true);
}
else
{
Toast.makeText(DummyDialog.this, "Sorry! Failed to start service", Toast.LENGTH_SHORT).show();
}
}
}
});