多个 Switch.setTextOn() 不更新开关的文本

Multiple Switch.setTextOn() not updating switch's text

我的 android Activity 中有两个 Switchs 按钮。
两者都有自定义动态 On/Off 文本(在运行时使用 Switch.setTextOn(CharSeq) 设置)。
它们看起来像这样(在另一个 SO 线程上找到的图像):

第一个开关的 on/off 文本设置一次。

我的目标是在第一个开关的状态改变时动态修改第二个开关的 on/off 文本。

所以我在第一个开关上设置了一个 OnCheckedChangeListener,如下所示:

 switch2.setTextOff("ImOff");  // works, the text is updated on the switch

 switch2.setTextOn("ImOn"); // same here

 switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(!isChecked)
                {
                   switch2.setTextOff(myStrings.get(2));  
                   switch2.setTextOn(myStrings.get(3));  // here switch2.getTextOn() returns the value of myStrings.get(3), but the widget still displays ImOn...
                } else
                {
                   switch2.setTextOff(myStrings.get(4));  
                   switch2.setTextOn(myStrings.get(5)); // here switch2.getTextOn() returns the value of myStrings.get(5), but the widget still displays ImOn...
                }
                // I tried to update the switch with this and this
                switch2.invalidate();
                switch2.setChecked(valuesSwitch.isChecked());
            }
        });

但是这段代码不起作用,第二个开关的on/off文本设置在对象上(getTextOn/Offreturns正确的文本),但小部件仍显示初始文本 ImOn/ImOff ...

有什么想法吗?谢谢。

我在这个 link,

中找到了解决方案

https://groups.google.com/forum/#!topic/android-developers/1IYypcoYXlk

在派生的 class(扩展开关)中,覆盖以下方法:

Override
public void request layout () {
    try {
        java.lang.reflect.Field mOnLayout = Switch.class.getDeclaredField ( "mOnLayout");
        mOnLayout.setAccessible (true);
        mOnLayout.set (this, null);
        java.lang.reflect.Field mOffLayout = Switch.class.getDeclaredField ( "mOffLayout");
        mOffLayout.setAccessible (true) ;
        mOffLayout.set (this, null);
    } Catch (Exception ex) {
        Log.e (TAG, ex.getMessage (), ex);
    }
    super.requestLayout ();
}