如何让Switch控件显示它“开启”或“关闭”?

时间:2017-11-24 08:47:50

标签: android user-experience

假设我有一个控制Android服务的Switch: 当Switch处于“on”状态时,表示服务正在运行, 当Switch处于“关闭”位置时,表示该服务未运行。 此外,当用户点击Switch时,它应该切换服务 (因此,切换Switch的显示状态,因为如上所述,Switch的显示状态正在跟踪服务的状态。)

方法#1:为交换机提供一个onCheckedChanged监听器,用于打开或关闭服务 取决于新的检查状态。

我不喜欢方法#1,因为当用户通过点击Switch打开服务时, 在服务实际开始之前,我不希望它看起来像它一样 这可能不是直接的 (它可能根本没有成功启动,但为了简单起见,我会忽略这种可能性)。 同样,当用户关闭服务时,我不希望Switch看起来像是关闭的 直到服务实际关闭。

方法#2:点击切换切换服务而不改变显示状态, 并且仅在通知服务已成功启动或关闭时切换显示的状态。

我也不喜欢方法#2(即使我知道如何实现它),因为用户没有得到 立即反馈水龙头被识别, 此外,如果服务没有成功改变状态,那么根本就没有反馈。我认为那很糟糕。

方法#3:点击开关立即切换拇指位置 但不是颜色 并切换服务,并使Switch的颜色跟踪服务的实际状态。 因此,相对于拇指位置的变化,颜色变化可能会延迟。

这意味着Switch将有4种可能的视觉状态而不是2:

  • “off”(拇指关闭,颜色关闭)off: thumb off, color off
  • “开启”(拇指开,颜色关闭)turning on: thumb on, color off
  • “on”(拇指开,颜色开)on: thumb on, color on
  • “关闭”(拇指关闭,颜色开启)turning off: thumb off, color on

我喜欢方法#3的想法。实施它的最简洁方法是什么?

在我看来,我可能需要安装两个监听器:

  • onCheckedChanged听众,允许拇指改变位置 像往常一样,但是将Switch的颜色设置为与通常情况相反的颜色 (这样它不会改变颜色),并切换服务
  • 一位听众,通知该服务已经上升或下降, 它可以独立于拇指位置设置开关的颜色 (虽然它也可能改变拇指位置, 如果服务由于外力而上升或下降, 因为我们希望Switch跟踪那个。)。

我确信我可以弄清楚如何实现服务上升或下降的通知。 并且,请注意我不想更改其默认的拇指位置行为。 所以我认为我需要知道的是:我如何暂时改变“on”开关以获得“关闭”配色方案,反之亦然?

我的印象可能涉及调用一个或多个Switch的方法 setTint()setTintList()setTintMode()。但我不确定这些电话会是什么。

我也欢迎任何其他好的想法,如何让开关立即反馈它“开启”或“关闭”而不立即显示为“开”或“关”。

2 个答案:

答案 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));

使用此代码,您可以以编程方式调整拇指/轨道颜色。您需要为每个不同的状态设置不同的颜色(如您所述)。根据您收到的状态/回调,您需要相应地更改颜色。它应该像这样工作。

另一个想法可能是:

  • 停用开关
  • 点击开关
  • 用加载指示器/旋转器替换开关
  • On Call Success:显示活动的微调器

答案 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();
                        }
                    }
            }
        });
相关问题