Как определить полужирный шрифт в селекторе Android?

В моем приложении для Android у меня есть пара кнопок с радио, которые должны иметь другой цвет и выделяться жирным шрифтом при выборе. Мне удалось получить другой цвет, определив файл radio_pick_color.xml в drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- checked -->
     <item android:state_checked="true"
           android:color="#00FF15" /> 
     <!-- default -->
     <item android:color="#4000FF" /> 
</selector>

и ссылаясь на этот файл в моем файле main.xml:

android:textColor="@drawable/radio_picker_color"

Теперь я хочу сделать то же самое для выделения текста жирным шрифтом. Поэтому я создал еще один файл с именем radio_picker_style.xml, в котором я хотел определить стиль следующим образом:

<item android:state_checked="true"
       android:style="bold" /> 

К сожалению, затмение жалуется на то, что идентификатор ресурса не может быть найден для атрибута «стиль» в пакете «андроид». Я также пробовал с android:textStyle, но внутри элемента селектора он также не знает атрибут android:textStyle.

Кто-нибудь знает, как я могу выделить выбранный переключатель жирным шрифтом?

==EDIT== Соответствующая часть моего файла main.xml:

<RadioGroup
    android:id="@+id/radioGroup2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <RadioButton
        android:id="@+id/option_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/option_1"
        android:textColor="@drawable/radio_picker_color"
        />

    <RadioButton
        android:id="@+id/option_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/option_2" 
        android:textColor="@drawable/radio_picker_color"
        />
</RadioGroup>

И radio_picker_style.xml, который я пытался поместить в папку для рисования, но в котором говорится: «Атрибут отсутствует префикс пространства имен Android»:

<?xml version="1.0" encoding="utf-8"?>
<style name="mystyle">  
    <item name="android:textColor">#ffffff</item>
    <item name="android:textStyle">bold</item>
</style>

person kramer65    schedule 01.10.2013    source источник
comment
возможный дубликат настраиваемой кнопки Android; изменение цвета текста   -  person ozbek    schedule 01.10.2013
comment
@shoerat - это абсолютно не дубликат вопроса, который вы предлагаете. Я знаю, как установить цвета, но сделать текст жирным - это то, что мне не удается. Вы знаете, как сделать выделенный текст жирным?   -  person kramer65    schedule 01.10.2013
comment
Единственное возможное решение, которое я вижу, - это сделать это во время выполнения...   -  person ozbek    schedule 02.10.2013


Ответы (3)


У стиля нет селектора: его использование либо нарушит сборку/среду выполнения, либо не будет иметь никакого эффекта и будет проигнорировано. Есть только два типа селекторов: для цветов и для рисунков.

Так что остается только один вариант: применять жирный стиль на лету, возможно, прослушивая изменения состояния чека.

=== Пример ===

MainActivity.java:

package com.example.radiobuttontest;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Typeface;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class MainActivity extends Activity implements CompoundButton.OnCheckedChangeListener {
    private RadioGroup mGroup2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGroup2 = (RadioGroup)findViewById(R.id.radioGroup2);

        RadioButton button1 = (RadioButton)findViewById(R.id.option_1);
        button1.setOnCheckedChangeListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        RadioButton checked = (RadioButton)findViewById(mGroup2.getCheckedRadioButtonId());
        checked.setTypeface(Typeface.DEFAULT_BOLD);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        buttonView.setTypeface(isChecked ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
    }
}

layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/radioGroup2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <RadioButton
        android:id="@+id/option_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/option_1"
        android:textColor="@drawable/radio_picker_color" />

    <RadioButton
        android:id="@+id/option_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/option_2"
        android:textColor="@drawable/radio_picker_color" />

</RadioGroup>

drawable/radio_picker_color.xml [Я изменил использованные вами цвета (они очень бледные) в вопросе с "#0099CC" для демонстрационных целей]:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- checked -->
     <item android:state_checked="true"
         android:color="#0099CC" />
     <!-- default -->
     <item android:color="#0099CC" />
</selector>

Результат:

с жирным эффектом

без жирного эффекта

Надеюсь это поможет.

person ozbek    schedule 02.10.2013

Вы можете сделать что-то вроде этого

Создайте свой собственный стиль, например. мой стиль.xml

<style name="mystyle">  
    <item name="android:textColor">#ffffff</item>
    <item name="android:textStyle">bold</item>
</style>

Теперь вызовите это в своем селекторе, как это

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
      android:state_checked="true"
      style="@style/mystyle" />
</selector>
person Jitender Dev    schedule 01.10.2013
comment
Я создал radio_selected.xml и скопировал туда ваш код, но он говорит, что в атрибуте отсутствует префикс пространства имен Android, поэтому я изменил все вхождения имени на android:name, но затем все еще говорит, что в атрибуте отсутствует android префикс пространства имен. Кроме того, он также говорит, что в файле макета обнаружен неожиданный текст: #fff. Любые идеи, что я делаю неправильно здесь? - person kramer65; 01.10.2013
comment
опубликуйте свой полный xml - person Jitender Dev; 01.10.2013
comment
Я добавил еще немного кода в свой вопрос. Это говорит вам больше? - person kramer65; 01.10.2013

Использовать

android:textStyle = "bold"
person SHANK    schedule 01.10.2013
comment
Извините, я должен был упомянуть, что это также не работает, когда вы находитесь внутри элемента селектора. Он также говорит, что у него нет атрибута textStyle. - person kramer65; 01.10.2013