假设我有一个控制Android服务的Switch: 当Switch处于“on”状态时,表示服务正在运行, 当Switch处于“关闭”位置时,表示该服务未运行。 此外,当用户点击Switch时,它应该切换服务 (因此,切换Switch的显示状态,因为如上所述,Switch的显示状态正在跟踪服务的状态。)
方法#1:为交换机提供一个onCheckedChanged
监听器,用于打开或关闭服务
取决于新的检查状态。
我不喜欢方法#1,因为当用户通过点击Switch打开服务时, 在服务实际开始之前,我不希望它看起来像它一样 这可能不是直接的 (它可能根本没有成功启动,但为了简单起见,我会忽略这种可能性)。 同样,当用户关闭服务时,我不希望Switch看起来像是关闭的 直到服务实际关闭。
方法#2:点击切换切换服务而不改变显示状态, 并且仅在通知服务已成功启动或关闭时切换显示的状态。
我也不喜欢方法#2(即使我知道如何实现它),因为用户没有得到 立即反馈水龙头被识别, 此外,如果服务没有成功改变状态,那么根本就没有反馈。我认为那很糟糕。
方法#3:点击开关立即切换拇指位置 但不是颜色 并切换服务,并使Switch的颜色跟踪服务的实际状态。 因此,相对于拇指位置的变化,颜色变化可能会延迟。
这意味着Switch将有4种可能的视觉状态而不是2:
我喜欢方法#3的想法。实施它的最简洁方法是什么?
在我看来,我可能需要安装两个监听器:
onCheckedChanged
听众,允许拇指改变位置
像往常一样,但是将Switch的颜色设置为与通常情况相反的颜色
(这样它不会改变颜色),并切换服务我确信我可以弄清楚如何实现服务上升或下降的通知。 并且,请注意我不想更改其默认的拇指位置行为。 所以我认为我需要知道的是:我如何暂时改变“on”开关以获得“关闭”配色方案,反之亦然?
我的印象可能涉及调用一个或多个Switch的方法
setTint()
,setTintList()
,setTintMode()
。但我不确定这些电话会是什么。
我也欢迎任何其他好的想法,如何让开关立即反馈它“开启”或“关闭”而不立即显示为“开”或“关”。
答案 0 :(得分:1)
我有点像你的主意。我认为setTintList
将成为你的朋友。
你想要做的是这样的事情:
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));
使用此代码,您可以以编程方式调整拇指/轨道颜色。您需要为每个不同的状态设置不同的颜色(如您所述)。根据您收到的状态/回调,您需要相应地更改颜色。它应该像这样工作。
另一个想法可能是:
答案 1 :(得分:0)
您想要切换的位置。请使用以下布局..
<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>
现在进入活动,您不需要任何onCheckedChangeListeners ..以下代码..
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();
}
}
}
});