Подтвердить что ты не робот

Андроид динамически меняет стиль во время выполнения

Я хотел бы настроить размер шрифта, но я также хотел бы использовать тег стиля в своих макетах. Можно ли изменить определение стиля во время выполнения? или это единственный способ вручную изменить отдельные элементы стиля на каждом текстовом изображении и т.д.?

4b9b3361

Ответ 1

Изменение стиля после создания представления не поддерживается.. так что вы можете сделать:

  • создать новый файл xroid типа x для типов значений
  • добавить новую тему
  • добавьте свои элементы в эту тему и их значения и сохраните файл

Теперь, когда вы динамически создаете новое представление, вы вызываете конструктор, который позволит определить defStyle. Затем вы указываете идентификатор стиля, который вы только что создали, указав R. "имя файла XML". "Ваш идентификатор стиля"

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

Ответ 2

Следующий образец кода динамически изменяет размер/стиль текста во время выполнения.

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

Ответ 3

Я не уверен, что это будет работать в вашем случае, но вы можете создавать темы, которые определяют ваши стили. Там Activity.setTheme(), который вы передаете в XML файл темы. Тема содержит кучу определений.

Я использовал его только для переопределения определенных глобальных стилей, таких как цвет фона, я не знаю, можете ли вы использовать его для определения стилей, которые будут использовать ваши виджеты. Стоит дать ему шанс. Если это сработает, пожалуйста, дайте мне знать!