Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使开关控件显示它';s";打开";或;关闭“;?_Android_User Experience - Fatal编程技术网

Android 如何使开关控件显示它';s";打开";或;关闭“;?

Android 如何使开关控件显示它';s";打开";或;关闭“;?,android,user-experience,Android,User Experience,假设我有一个控制android服务的开关: 当交换机处于“开启”状态时,表示服务正在运行, 当开关处于“关闭”位置时,表示服务未运行。 此外,当用户点击开关时,它应该切换服务 (因此切换交换机的显示状态,因为如前所述,交换机的显示状态正在跟踪服务的状态) 方法#1:为开关提供一个打开或关闭服务的onCheckedChanged侦听器 取决于新选中的状态 我不喜欢方法1,因为当用户点击开关打开服务时, 我不想让它看起来像是开着的直到服务真正开始, 这可能不是立即的 (它可能根本无法成功启动,但为了

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

方法#1:为开关提供一个打开或关闭服务的
onCheckedChanged
侦听器 取决于新选中的状态

我不喜欢方法1,因为当用户点击开关打开服务时, 我不想让它看起来像是开着的直到服务真正开始, 这可能不是立即的 (它可能根本无法成功启动,但为了简单起见,我将忽略这种可能性)。 同样,当用户关闭服务时,我不希望开关看起来像关闭了一样 直到服务真正关闭

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

我也不喜欢方法2(即使我知道如何实现它),因为用户没有得到 立即反馈该水龙头已被识别, 而且,如果服务没有成功地改变状态,那么就没有任何反馈。我认为那很糟糕。< /P> 方法#3:使其如此:点击开关立即切换拇指位置,但不切换颜色 和切换服务,并使交换机的颜色跟踪服务的实际状态。 因此,相对于拇指位置的变化,颜色变化可能会延迟

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

  • “关闭”(拇指关闭,颜色关闭)
  • “打开”(拇指打开,颜色关闭)
  • “打开”(拇指打开,颜色打开)
  • “关闭”(拇指关闭,颜色打开)
我喜欢方法3的想法。最干净的实现方式是什么

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

  • 一个
    onCheckedChanged
    监听器,允许拇指改变位置 和往常一样,但这会将开关的颜色设置为与通常相反的颜色 (这样它就不会改变颜色),并切换服务
  • 用于通知服务已启动或关闭的侦听器, 它独立于拇指位置设置开关的颜色 (虽然它也可能改变拇指的位置, 如果服务因外力而上升或下降, 因为我们想让开关跟踪它)
我确信我能想出如何实现服务启动或关闭的通知。 请注意,我不想更改拇指位置行为的默认值。 所以我想我真正需要知道的是:我如何临时改变一个“开”的开关,使其具有“关”的配色方案,反之亦然

我的印象是,这可能涉及调用一个或多个Switch的方法
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();
                        }
                    }
            }
        });