2010-10-07 19 views
64

Estoy trabajando en la aplicación de Android. Quiero que se coloquen 4 botones horizontalmente en la parte inferior de la pantalla. En estos 4 botones, 2 botones tienen imágenes en ellos. El borde de los botones debe ser de color negro y el borde debe ser lo más delgado posible. Cuando hago clic en el botón, quiero que el fondo del botón cambie a color azul sin cambiar el color del borde y debe permanecer en ese color durante un tiempo. ¿Cómo puedo lograr este escenario en Android?¿Cómo cambiar el color del botón en Android cuando se hace clic?

Respuesta

7

Consulte esto,

boolean check = false; 
Button backward_img; 
Button backward_img1; 
backward_img = (Button) findViewById(R.id.bars_footer_backward); 
backward_img1 = (Button) findViewById(R.id.bars_footer_backward1); 
backward_img.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
     check = true; 
     backward_img.setBackgroundColor(Color.BLUE); 
    } 
}); 

if (check == true) { 
    backward_img1.setBackgroundColor(Color.RED); 
    backward_img.setBackgroundColor(Color.BLUE); 
} 
+2

Esto configurará el BG permanentemente, es decir, si el usuario hace clic en el botón Atrás, el fondo será rojo. – methode

+0

@methode: ok, consulte la nueva respuesta que he corregido oldanswer –

110

Un enfoque consiste en crear un archivo XML como este en drawable, llamado whatever.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/bgalt" /> 

    <item 
     android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/bgalt" /> 

    <item android:drawable="@drawable/bgnorm" /> 
</selector> 

bgalt y bgnorm son imágenes PNG en dibujable.

Si crea los botones programáticamente en su actividad, se puede establecer el fondo con:

final Button b = new Button (MyClass.this); 
b.setBackgroundDrawable(getResources().getDrawable(R.drawable.whatever)); 

Si establece sus botones estilo con un XML, que haría algo así:

<Button 
    android:id="@+id/mybutton" 
    android:background="@drawable/watever" /> 

Y finalmente un link to a tutorial. Espero que esto ayude.

+16

También puede reemplazar esos archivos descartables en el archivo XML con definiciones de colores si desea evitar el uso de imágenes. – haseman

+0

@haseman increíble ... ¿cómo lo sabes? –

+6

@ jshin47 una cantidad empírica de prueba y error. He escrito dos libros sobre el desarrollo de Android ahora :-) – haseman

4

Prueba esto ......

En primer lugar crear un archivo XML denominado button_pressed.xml Estos son sus contenidos.

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

No intente esto con el botón.

int imgID = getResources().getIdentifier("button_pressed", "drawable", getApplication().getPackageName()); 
button.setImageResource(imgID); 

button_pressed.xml debe estar en la carpeta dibujable. icon_1_press e icon_1 son dos imágenes para presionar un botón y enfocar normalmente.

5

Si desea cambiar la imagen de fondo o el color del botón cuando se lo presiona, simplemente copie este código y pegue su proyecto en la ubicación exacta que se describe a continuación.

 <!-- Create new xml file like mybtn_layout.xml file in drawable --> 
<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true" android:drawable="@drawable/pressed" /> <!--pressed --> 
<item android:drawable="@drawable/normal" /> <!-- Normal --> 
</selector> 
    <!-- Now this file should be in a drawable folder and use this 
    single line code in button code to get all the properties of this xml file --> 

    <Button 
     android:id="@+id/street_btn" 
     android:layout_width="wrap_content" 
     android:background="@drawable/layout_a" > <!-- your required code --> 
    </Button> 
66

Guardar este código en la carpeta estirable con "bg_button.xml" y llamar "@ estirable/bg_button" como fondo de botón en su xml:

<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
     <shape> 
      <solid 
       android:color="#004F81" /> 
      <stroke 
       android:width="1dp" 
       android:color="#222222" /> 
      <corners 
       android:radius="7dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 
    <item> 
     <shape> 
      <gradient 
       android:startColor="#89cbee" 
       android:endColor="#004F81" 
       android:angle="270" /> 
      <stroke 
       android:width="1dp" 
       android:color="#4aa5d4" /> 
      <corners 
       android:radius="7dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 
</selector> 
+2

Gracias hombre, con estilo puede reducir el tamaño de la aplicación. buena idea para no usar drawable –

+0

Por otro lado, los fondos extraíbles basados ​​en vectores xml suelen ser peores para el rendimiento que las imágenes, especialmente en dispositivos más antiguos. No optimices prematuramente, pero tenlo en cuenta también. –

6

Trate Esta

final Button button = (Button) findViewById(R.id.button_id); 
    button.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      if(event.getAction() == MotionEvent.ACTION_UP) { 
       button.setBackgroundColor(Color.RED); 
      } else if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       button.setBackgroundColor(Color.BLUE); 
      } 
      return false; 
     } 

    }); 
-1

hai la manera más fácil es esto:

agrega este código a mainactivity.java

public void start(View view) { 

    stop.setBackgroundResource(R.color.red); 
start.setBackgroundResource(R.color.yellow); 
} 

public void stop(View view) { 
stop.setBackgroundResource(R.color.yellow); 
start.setBackgroundResource(R.color.red); 
} 

y luego en su actividad

<button android:id="@+id/start" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="start" android:text="Click"> 

</button><button android:id="@+id/stop" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="stop" android:text="Click"> 

o seguir a lo largo de esta tutorial

1

Soy utilizar este código (con efecto dominó):

<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/color_gray"> 
<item android:id="@android:id/mask"> 
    <color android:color="@color/color_gray" /> 
</item></ripple> 
1

que pueda intente este código para resolver su problema

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
    android:drawable="@drawable/login_selected" /> <!-- pressed --> 
    <item android:state_focused="true" 
    android:drawable="@drawable/login_mouse_over" /> <!-- focused --> 
    <item android:drawable="@drawable/login" /> <!-- default --> 
</selector> 

escribir este código en tu dibujable hacer un nuevo recurso y el nombre de lo que quiere y luego escribir el nombre de este drwable en el botón mismos que nos referimos a la imagen src en Android

+0

Esta respuesta apareció en la cola de revisión de baja calidad, presumiblemente porque no proporciona ninguna explicación del código. Si este código responde a la pregunta, considere agregar agregando texto que explique el código en su respuesta. De esta forma, es mucho más probable que obtengas más votos ascendentes y ayudes al indagador a aprender algo nuevo. – lmo

5
<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- default --> 
    <item 
     android:state_pressed="false" 
     android:state_focused="false"> 
     <shape 
      android:innerRadiusRatio="1" 
      android:shape="rectangle" > 
      <solid android:color="#00a3e2" /> 

      <padding 
       android:bottom="10dp" 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" /> 

     </shape> 
    </item> 

    <!-- button focused --> 
    <item 
     android:state_pressed="false" 
     android:state_focused="true"> 
     <shape 
      android:innerRadiusRatio="1" 
      android:shape="rectangle" > 
      <solid android:color="#5a97f5" /> 

      <padding 
       android:bottom="5dp" 
       android:left="10dp" 
       android:right="10dp" 
       android:top="5dp" /> 
     </shape></item> 

    <!-- button pressed --> 
    <item 
     android:state_pressed="true" 
     android:state_focused="false"> 
     <shape 
      android:innerRadiusRatio="1" 
      android:shape="rectangle" > 
      <solid android:color="#478df9"/> 
      <padding 
       android:bottom="10dp" 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" /> 
     </shape></item> 
</selector> 
+4

Realmente no puedo entender la cita inicial "Ya Mahdi aj" ... –

+0

Probablemente quiso decir ** "Hail Mahdi aj" ** – CodeIt

+0

el Mahdī, es el último salvador de la humanidad y el Imán final de los Doce Imames que Emergerá con Isa (Jesucristo) para cumplir su misión de traer paz y justicia al mundo. –

0

Para hacer frente adecuadamente por cuánto tiempo desea que el botón permanezca en su otro color que aconsejaría esta versión:

button.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch(event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         button.setBackground(getResources().getDrawable(R.drawable.on_click_drawable)); 
         break; 
        case MotionEvent.ACTION_UP: 
         new java.util.Timer().schedule(
           new java.util.TimerTask() { 
            @Override 
            public void run() { 
             ((Activity) (getContext())).runOnUiThread(new Runnable() { 
              @Override 
              public void run() { 
               button.setBackground(getResources().getDrawable(R.drawable.not_clicked_drawable)); 
              } 
             }); 
            } 
           }, BUTTON_CLICK_TIME_AFTER_RELEASE_ANIMATION); 
         break; 
        default: 
       } 
       return false; 
      } 
     }); 

BUTTON_CLICK_TIME_AFTER_RELEASE_ANIMATION indica después de cuánto tiempo [ms] el botón se restablecerá a su estado anterior (sin embargo migh quiero usar algún valor booleano para verificar que el botón no se haya utilizado entre medio, dependiendo de lo que quiera lograr ...).

Cuestiones relacionadas