我遇到一个问题,我无法在运行时更改Switch textOn / textOff内容。这意味着,以下代码绑定到一个简单的Button(用于测试目的)不起作用:
private int _counter = 1;
@Override
public void onClick(View arg0) {
_sw.setTextOn("On " + _counter);
_sw.setTextOff("Off " + _counter);
_sw.setText("Text" + _counter);
_sw.setVisibility(_sw.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
_counter ++;
_sw.invalidate(); // no effect
_sw.setFocusable(true); // no effect
_sw.getTextOn(); // returns the correct value which was set above
}
此代码更改与Switch关联的文本(setText
方法工作),但不更改交换机上的On或Off标签。有趣的是,如果我调用getTextOn
或getTextOff
,我会返回在此Switch上设置的正确值。任何想法为什么这不能按预期工作?
此致
米哈。
答案 0 :(得分:4)
由于缺乏更好的方法(我愿意接受建议),我使用了一个丑陋的反思黑客来解决这个问题。我有一个扩展Switch的类,我实现了以下方法:
@Override
public void requestLayout() {
IslLog.i(TAG, "requestLayout");
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 x) {
Log.e(TAG, x.getMessage(), x);
}
super.requestLayout();
}
这现在有效。在我使用setTextOn
或setTextOff
后,我只需拨打requestLayout
,即使用反射将mOnLayout
和mOffLayout
设为null; requestLayout
依次触发onMeasure
,重新初始化这些变量。它很丑陋,但它的工作原理是,恕我直言,比将Switch的完整源代码复制到应用程序更好。