1

我试图将文本设置为SwitchCompat,但它不起作用。它只在第一次工作。但是当您尝试更改文本时(例如单击按钮时),它不起作用。

例如:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final SwitchCompat switchCompat = (SwitchCompat)findViewById(R.id.switch_test);
    switchCompat.setTextOn("Yes");
    switchCompat.setTextOff("No");
    switchCompat.setShowText(true);

    Button buttonTest = (Button)findViewById(R.id.button_test);
    buttonTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switchCompat.setTextOn("YOO");
            switchCompat.setTextOff("NAH");
            //switchCompat.requestLayout();  //tried to this but has no effect
            //switchCompat.invalidate();     //tried to this but has no effect
        }
    });
}

您将看到文本保持为YesNo。我试图打电话requestLayout()invalidate()但没有成功。任何想法?

4

1 回答 1

4

问题是,SwitchCompat设计时并没有考虑到这种情况。它具有私有字段mOnLayoutmOffLayout,它们只计算一次,以后在更改文本时不会重新计算。

因此,您必须明确地将它们清空才能更改文本以启动重新创建这些布局。


    buttonTest.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        try {
          Field mOnLayout = SwitchCompat.class.getDeclaredField("mOnLayout");
          Field mOffLayout = SwitchCompat.class.getDeclaredField("mOffLayout");

          mOnLayout.setAccessible(true);
          mOffLayout.setAccessible(true);

          mOnLayout.set(switchCompat, null);
          mOffLayout.set(switchCompat, null);
        } catch (NoSuchFieldException e) {
          e.printStackTrace();
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        }

        switchCompat.setTextOn("YOO");
        switchCompat.setTextOff("NAH");

      }
    });

结果:

在此处输入图像描述

于 2017-08-11T06:53:23.640 回答