无法在运行时更改开关文本

时间:2013-11-05 13:44:31

标签: android

我遇到一个问题,我无法在运行时更改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标签。有趣的是,如果我调用getTextOngetTextOff,我会返回在此Switch上设置的正确值。任何想法为什么这不能按预期工作?

此致

米哈。

1 个答案:

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

这现在有效。在我使用setTextOnsetTextOff后,我只需拨打requestLayout,即使用反射将mOnLayoutmOffLayout设为null; requestLayout依次触发onMeasure,重新初始化这些变量。它很丑陋,但它的工作原理是,恕我直言,比将Switch的完整源代码复制到应用程序更好。