多个 Switch.setTextOn() 不更新开关的文本
Multiple Switch.setTextOn() not updating switch's text
我的 android Activity 中有两个 Switch
s 按钮。
两者都有自定义动态 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/Off
returns正确的文本),但小部件仍显示初始文本 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 ();
}
我的 android Activity 中有两个 Switch
s 按钮。
两者都有自定义动态 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/Off
returns正确的文本),但小部件仍显示初始文本 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 ();
}