настроить кнопку переключения на Android

Я настроил кнопку Toggle с помощью drawable, определенного с помощью селектора. Я использую этот рисунок в качестве фона для кнопки переключения.

<ToggleButton
    android:id="@+id/mailbox:toggle_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:layout_weight="1"
    android:background="@drawable/toggle_background"
    android:gravity="center_horizontal|center_vertical" />

Toggle_background определяется здесь:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/img1"
            android:state_checked="true" />
        <item
            android:drawable="@drawable/img2"
            android:state_checked="false" />    
    </selector>

Проблема в том, что изображение всегда растянуто. Есть ли способ определить изображение для двух состояний, которое не растянуто?

Что мне нужно, так это фон, который будет растягиваться, и в центре кнопки значок, который не должен растягиваться.

Является ли это возможным?


person kingston    schedule 04.10.2012    source источник
comment
Покажите снимок экрана и связанный с ним код ToggleButton   -  person Praveenkumar    schedule 04.10.2012
comment
Вы должны использовать изображение с девятью патчами (.9 patch).   -  person Chirag    schedule 04.10.2012
comment
9 исправлений нельзя использовать, так как мне нужно, чтобы нерастянутая иконка находилась в центре.   -  person kingston    schedule 04.10.2012
comment
удалить андроид: layout_weight = 1   -  person Padma Kumar    schedule 04.10.2012
comment
Мне нужно определить вес, потому что мне нужно растянуть фон   -  person kingston    schedule 04.10.2012


Ответы (5)


Я сделал ту же задачу таким образом, кнопка:

        <ToggleButton  android:id="@+id/mlAbout"
            android:textOn="@string/about"
            android:textOff="@string/about"
            android:background="@drawable/ml_about" />

@drawable/ml_about:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/list_bg_top"></item>
    <item android:left="10dp">
        <bitmap android:src="@drawable/waiting_status_btn"
          android:gravity="center_vertical|left" />
    </item>
</layer-list>

@drawable/list_bg_top фоновое изображение, которое будет растянуто, а @drawable/waiting_status_btn — это значок, который не будет растягиваться вместе с виджетом

person Dimanoid    schedule 04.10.2012
comment
Решение неявно дано в ответе. Способ получить нерастянутое изображение - использовать растровое изображение, а не рисовать. Мне пришлось изменить предложенное решение, чтобы разрешить иметь два разных изображения для разных состояний: я использовал рисуемый объект в списке слоев, а затем я определил рисуемый объект с помощью селектора, который для каждого состояния использует растровое изображение. - person kingston; 05.10.2012
comment
Это неправильно - если вы хотите, чтобы ToggleButton вел себя со стандартными состояниями. Предположим, что ваш wait_status_btn представляет собой рисуемый XML: у вас не может быть рисуемого XML в качестве src для растрового изображения. Как указано здесь: stackoverflow.com/questions/9788726/using-drawable-resources - person albertpeiro; 31.03.2014

Это мое окончательное решение.

В макете:

<ToggleButton
    android:id="@+id/mailbox:toggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"     
    android:background="@drawable/toggle_drawable_layers"/>

в файле toggle_drawable_layers.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/toggle_drawable_bkg"></item>
    <item android:left="10dp" android:drawable="@drawable/toggle_drawable_left"
          android:gravity="center_vertical|center_horizontal" />
</layer-list>

в toggle_drawable_left.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <bitmap android:src="@drawable/bitmap_checked"
          android:gravity="center_vertical|center_horizontal" />
    </item>
    <item android:state_checked="false">
        <bitmap android:src="@drawable/bitmap_unchecked"
          android:gravity="center_vertical|center_horizontal" />
    </item>        
</selector>
person kingston    schedule 05.10.2012
comment
что такое toggle_drawable_bkg? когда речь идет о? - person Chandra Kiran; 21.03.2013
comment
Ваше решение работает. Но я обнаружил, что если вы используете android:background="@null" и android:button="@drawable/toggle_drawable_left", вы можете пропустить использование третьего xml-файла toggle_drawable_layers.xml. Изображения не будут растягиваться. - person AlexAndro; 20.08.2014

Просто используйте растровые изображения вместо рисунков в вашем селекторе, например (нет необходимости использовать слои):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/img1"
        android:state_checked="true" />
    <item
        android:drawable="@drawable/img2"
        android:state_checked="false" />    
</selector>

Кроме того, не забудьте объявить android:textOff="" android:textOn="" в объявлении ToggleButton.

person lytridic    schedule 11.12.2013

Это и это обязательно вам поможет

person Manoj Kumar    schedule 04.10.2012
comment
это не работает. Даже если я определяю фон и изображение переключения отдельно, они оба растягиваются. - person kingston; 04.10.2012
comment
сними вес, вот ми8 в помощь - person Manoj Kumar; 04.10.2012
comment
Мне нужен вес для фона - person kingston; 04.10.2012
comment
поместите кнопку внутри линейного макета, придайте вес макету, а не кнопке; - person Manoj Kumar; 05.10.2012
comment
Я даю вам +1, потому что я использовал что-то в предложенных ссылках, но, пожалуйста, прочитайте мой комментарий в ответе Dimanoid. - person kingston; 05.10.2012
comment
Я даю вашему вопросу +1, потому что я узнал кое-что полезное из него и комментария, который вы упомянули, спасибо - person Manoj Kumar; 05.10.2012

Есть еще один способ решить проблему растяжения:

Просто преобразуйте изображение в изображение с девятью исправлениями, где растягиваемые области просто со всех сторон изображения.

Тогда Android будет растягивать изображение только в невидимых областях, а видимое изображение останется без изменений.

person Jörg Eisfeld    schedule 28.04.2014