2012-01-05 5 views
71

У меня есть кнопка, как показано ниже. Когда я хочу отключить его, я использую my_btn.setEnabled(false), но мне также хотелось бы сгладить его. Как я могу это сделать?Как выровнять кнопку?

Благодаря

<Button android:id="@+id/buy_btn" style="@style/srp_button" /> 

стиль/srp_button

<style name="srp_button" parent="@android:style/Widget.Button"> 
    <item name="android:background">@drawable/btn_default</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:textSize">14sp</item> 
    <item name="android:typeface">serif</item> 
    <item name="android:paddingLeft">30dp</item> 
    <item name="android:paddingRight">30dp</item> 
    <item name="android:paddingTop">5dp</item> 
    <item name="android:paddingBottom">5dp</item> 
</style> 

вытяжке/btn_default.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/pink" /> 
    <corners android:radius="6dp" /> 
</shape> 
+2

используйте селектор http://stackoverflow.com/questions/7335345/button-background-selector –

ответ

44

Вы должны предоставить 3 или 4 состояния в вашем btn_defaut.xml, как селе т е р.

  1. залипшей
  2. состояние по умолчанию
  3. Фокус состояние
  4. Enabled состояние (Disable состояние ложной индикации; см комментарии)

Вы обеспечите эффект и фон для состояний соответственно.

Ниже приведено подробное обсуждение: Standard Android Button with a different color

+0

Итак, чтобы сгладить его, я должен изменить цвет фона и цвет текста в состоянии отключения ? Невозможно просто добавить прозрачный передний план? – jul

+3

Да! что вы предоставите для 'android: state_disable =" true ", он покажет состояние, когда кнопка отключена, простой и рекомендуемый способ. –

+0

и где можно указать цвет текста для отключенного состояния? Кажется, что можно указать только фон ... Я задал новый вопрос: http://stackoverflow.com/questions/8743584/how-to-set-the-text-style-of-a-button- in-selectors – jul

9
Button button = (Button)findViewById(R.id.buy_btn); 
button.setEnabled(false); 
+1

Это не отвечает на вопрос. –

9

Set кликабельны как ложные и изменить фоновой цвет, как:

callButton.setClickable(false); 
callButton.setBackgroundColor(Color.parseColor("#808080")); 
37

Самым простым решением является установка цветового фильтра на фоновое изображение a, как я увидел here

Вы можете сделать следующее:

if ('need to set button disable') 
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); 
else 
    button.getBackground().setColorFilter(null); 

Надеется, что я помог кому-то ...

+0

Мне нравится этот подход лучше всего. Благодаря! – mtb

+1

Этот подход имеет потенциал, но полученный цвет - это не всегда то, что вы думаете. Например, оранжевая кнопка с увеличенным цветом серого приводит к темно-красному цвету - не к выцветшему апельсину. –

+2

, возможно, вместо Multiply следует использовать режим Mode.SRC_IN'. См. Http://stackoverflow.com/a/17112876/550471 –

96

Вы можете также сделать вид, как отключить, установив альфа (что делает его полупрозрачный). Это особенно полезно, если фон кнопки - это изображение, и вы не хотите создавать для него состояния.

button.setAlpha(.5f); 
button.setClickable(false); 
+0

Быстрое, простое, удобное в работе и нечистое решение. –

+4

Я читал, что вызовы setAlpha стоят дорого на CPU. Может ли кто-нибудь подтвердить? –

+0

@AliKazi зависит от типа вашего 'View'. Из [этого сообщения G +] (https://plus.google.com/+CyrilMottier/posts/DuAZMhFPDjv): «Если ваш просмотр не содержит перекрывающихся команд рисования,' setAlpha() 'оптимизируется, и мы просто модифицируем Paint объекты, чтобы применить соответствующую альфу. Это происходит, когда 'View.hasOverlappingRendering()' возвращает true. 'ImageView' и 'TextView' без фонового выделения являются обычными кандидатами для этой оптимизации. Если вы находитесь в этой ситуации, используйте 'setAlpha() 'столько, сколько вы хотите.". – Sufian

8

Все данные ответы работают хорошо, но я помню, что обучение с помощью SetAlpha может быть bad idea производительность мудрым (подробнее here). Поэтому создание StateListDrawable - это лучшая идея для управления отключенным состоянием кнопок. Вот как:

Создание XML btn_blue.xml в разрешении/вытяжке папку:

<!-- Disable background --> 
<item android:state_enabled="false" 
     android:color="@color/md_blue_200"/> 

<!-- Enabled background --> 
<item android:color="@color/md_blue_500"/> 

Создать стиль кнопки в рес/значений/стилей.XML

<style name="BlueButton" parent="ThemeOverlay.AppCompat"> 
     <item name="colorButtonNormal">@drawable/btn_blue</item> 
     <item name="android:textColor">@color/md_white_1000</item> 
</style> 

Затем примените этот стиль к кнопке:

<Button 
    android:id="@+id/my_disabled_button" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/BlueButton"/> 

Теперь, когда вы звоните btnBlue.setEnabled(true) ИЛИ btnBlue.setEnabled(false) государственные цвета будут автоматически переключаться.

5

Вы должны создать XML-файл для кнопки инвалидов (вытяжки/btn_disable.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/grey" /> 
    <corners android:radius="6dp" /> 
</shape> 

И создать селектор для кнопки (вытяжки/btn_selector.xml)

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/> 
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/> 
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" /> 

</selector> 

Добавить селектор на вашу кнопку

<style name="srp_button" parent="@android:style/Widget.Button"> 
    <item name="android:background">@drawable/btn_selector</item> 
</style> 
0

u можете сделать серое изображение и вставить его в свой код и добавить его в свой код.

button.setBackgroundResource(R.drawable.grey); 

простой, простой, но из-за использования изображения он получает немного больше места.

Смежные вопросы