1

実行時に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
}    

このコードは、setTextSwitch に関連付けられたテキスト ( method works) を変更しますが、スイッチの 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を使用した後、リフレクションを使用して null を設定する を呼び出すだけですsetTextOff。次に、これらの変数を再初期化する をトリガーします。それは醜いですが、機能し、スイッチの完全なソースをアプリケーションにコピーするよりも優れています。requestLayoutmOnLayoutmOffLayoutrequestLayoutonMeasure

于 2013-11-06T11:45:24.010 に答える