SwitchCompat setTextOn() и setTextOff() не работают во время выполнения

Я пытался установить текст на 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
        }
    });
}

Вы увидите, что текст остается как Да, так и Нет. Я пытался позвонить requestLayout() а также invalidate() без успеха. Любая идея?

1 ответ

Решение

Проблема в том, что SwitchCompat не предназначен для этого случая. Имеет частные поля mOnLayout а также mOffLayout, которые вычисляются один раз и не пересчитываются позже при изменении текста.

Таким образом, вы должны явно обнулить их для изменения текста, чтобы инициировать воссоздание этих макетов.


    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");

      }
    });

Результат:

введите описание изображения здесь

Другие вопросы по тегам