2017-08-05 8 views
1

SwitchCompatにテキストを設定しようとしましたが、動作しません。それは初めての作業です。しかし、テキストを変更しようとしたとき(たとえば、ボタンをクリックしたときなど)、テキストは機能しません。例えばSwitchCompatランタイム時にsetTextOn()およびsetTextOff()が機能しない

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()に電話をかけようとしましたが、成功しませんでした。何か案が?

答えて

4

問題は、SwitchCompatはそのような場合を考慮して設計されていないということです。一度計算されるプライベートフィールドmOnLayoutmOffLayoutと、テキストが変更されるときにnot recomputed laterとなります。

したがって、テキストの変更を明示的に無効にして、レイアウトを再作成する必要があります。

 

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

     } 
    }); 
 

結果:

enter image description here

+1

素敵な解決策!私は同じ答えを投稿していたが、最初に来た:) –

+1

私の男は誰ですか?私の人は誰ですか?アジズベキアンは私の人です!ありがとう、それは働いた! – Sam

関連する問題