web-dev-qa-db-ja.com

android実行時に動的にスタイルを変更

フォントサイズを構成可能にしたいのですが、レイアウトでスタイルタグを使用したいのです。実行時にスタイルの定義を変更することは可能ですか?または、各テキストビューなどで個々のスタイル要素を手動で変更する唯一のオプションですか?

37
Ben

ビューを作成した後にスタイルを変更することはサポートされていません..でできることは:

  1. タイプ値の新しいAndroid xmlファイルを作成します
  2. 新しいテーマを追加
  3. そのテーマとその値に要素を追加し、ファイルを保存します

ここで、新しいビューを動的に作成するときに、defStyleを定義できるコンストラクターを呼び出します。次に、Rをポイントして、作成したスタイルIDをポイントします。「XMLファイル名」。「スタイルID」

myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
15
AhmadAssaf

次のサンプルコードは、実行時にテキストのサイズ/スタイルを動的に変更します。

attrs.xml

  <?xml version="1.0" encoding="utf-8"?>
  <resources>
       <!-- View styles -->
       <attr name="textTitle" format="reference" />
       <attr name="textBody" format="reference" />
  </resources>

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="small_title_text">
      <item name="Android:textSize">22sp</item>
      <item name="Android:textColor">@color/green</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>
   <style name="small_body_text">
      <item name="Android:textSize">16sp</item>
      <item name="Android:textColor">@color/white</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>
   <style name="large_title_text">
      <item name="Android:textSize">28sp</item>
      <item name="Android:textColor">@color/red</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>

   <style name="large_body_text">
      <item name="Android:textSize">20sp</item>
      <item name="Android:textColor">@color/white</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>

  <!-- Base application theme is the default theme. -->
  <style name="Theme" parent="Android:Theme">
  </style>

  <style name="Theme.Small">
     <item name="textTitle">@style/small_title_text</item>
     <item name="textBody">@style/small_body_text</item>
  </style>

  <style name="Theme.Large">
      <item name="textTitle">@style/large_title_text</item>
      <item name="textBody">@style/large_body_text</item>
  </style>
 </resources>

main.xml

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:orientation="vertical"
     Android:layout_width="fill_parent"
     Android:layout_height="fill_parent"
     >

 <RadioGroup
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">
<RadioButton 
    Android:text="Large Text" 
    Android:id="@+id/textSizeLarge" 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content">
</RadioButton>
<RadioButton 
    Android:text="Small Text" 
    Android:id="@+id/textSizeSmall" 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content">
</RadioButton>
 </RadioGroup>
 <TextView  
      Android:id="@+id/title" 
style="?textTitle" 
     Android:layout_width="fill_parent" 
     Android:layout_height="wrap_content" 
     Android:text="Select the size of the text"
     />
 <TextView  
    Android:id="@+id/body" 
    style="?textBody" 
     Android:layout_width="fill_parent" 
     Android:layout_height="wrap_content" 
     Android:text="@string/message"
     />
 </LinearLayout>

Activity.Java

     public void onCreate(Bundle savedInstanceState) {
         if ("Large".equalsIgnoreCase( getIntent().getStringExtra( "Theme" )))
         {
             setTheme(R.style.Theme_Large);
         }
         else if ("Small".equalsIgnoreCase( getIntent().getStringExtra( "Theme" )))
         {
             setTheme(R.style.Theme_Small);
         }
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         RadioButton largeText = ( RadioButton ) findViewById( R.id.textSizeLarge );
         largeText.setOnClickListener( new OnClickListener() {
             public void onClick( View view ) {
                 Toast.makeText(context, "Large Text Selected", Toast.LENGTH_SHORT).show();
            Intent intent = getIntent();
            intent.putExtra( "Theme", "Large" );
            finish();
            startActivity(intent);
        }
    } );

    RadioButton smallText = ( RadioButton ) findViewById( R.id.textSizeSmall );
    smallText.setOnClickListener( new OnClickListener() {
        public void onClick( View view ) {
            Toast.makeText(context, "Small Text Selected", Toast.LENGTH_SHORT).show();
            Intent intent = getIntent();
            intent.putExtra( "Theme", "Small" );
            finish();
            startActivity(intent);
        }
    } );
}
93
Janarthanan

これがあなたのケースで機能するかどうかはわかりませんが、スタイルを定義するテーマを作成できます。テーマXMLファイルで渡すActivity.setTheme()があります。テーマには多数の定義が含まれています。

背景色などの特定のグローバルスタイルをオーバーライドするためだけに使用しましたが、ウィジェットが使用するスタイルを定義するために使用できるかどうかはわかりません。ただし、試してみる価値はあります。動作する場合は、お知らせください!

5
EboMike