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");
}
});
Результат: