1

我有一个问题,我无法在运行时更改Switch textOn/textOff 内容。这意味着,绑定到简单按钮(用于测试目的)的以下代码不起作用:

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
}    

此代码更改setText与 Switch 关联的文本(方法工作),但不会更改开关上的 On 或 Off 标签。有趣的是,如果我调用getTextOnor getTextOff,我会取回在此 Switch 上设置的正确值。任何想法为什么这不能按预期工作?

问候,

米哈。

4

1 回答 1

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

这现在有效。在我使用setTextOnor之后setTextOff,我只调用requestLayout,它使用反射来设置mOnLayoutmOffLayout为空;requestLayout依次触发onMeasure,它重新初始化这些变量。它很丑陋,但它有效,而且恕我直言,它比将 Switch 的完整源代码复制到应用程序更好。

于 2013-11-06T11:45:24.010 回答