2013-12-03 10 views
1

У меня есть кнопка изображения в качестве кнопки включения/выключения, я хочу изменить исходное изображение этого изображения, щелкнув, чтобы переключаться между включенными и выключенными, все, что мне нужно сделать, это поместить сравнение в мой прослушиватель кликов и операцию переключения переключатель идет нормально, проблема здесь с сравнения, я попытался как миллион способов, и все не работает,Как изменить изображение кнопки фона при нажатии?

, например, я попытался:

public void onClick(View v) { 

     if (v == power) { 

      Drawable fDraw = power.getBackground(); 
      Drawable sDraw = getResources().getDrawable(R.drawable.acoffdormant); 

      Bitmap bitmap = ((BitmapDrawable)fDraw).getBitmap(); 
      Bitmap bitmap2 = ((BitmapDrawable)sDraw).getBitmap(); 

      if (bitmap == bitmap2) { 
       power.invalidateDrawable(getResources().getDrawable(R.drawable.acoffdormant)); 
       power.setImageResource(R.drawable.acondormant); 
      } else { 
       power.invalidateDrawable(getResources().getDrawable(R.drawable.acondormant)); 
       power.setImageResource(R.drawable.acoffdormant); 
      } 
     } 

    } 
}; 

а также:

if (getResources().getDrawable(R.drawable.acoffdormant).hashCode() == power.getBackground().hashCode()) 

И также:

v.getBackground().getConstantState().equals(getResources().getDrawable(R.drawable.acoffdormant).getConstantState()) 

А также:

   Drawable state = power.getBackground(); 
       Bitmap statebit = ((BitmapDrawable)state).getBitmap(); 
       Bitmap off = BitmapFactory.decodeResource(power.getResources(), 
         R.drawable.acoffdormant); 

       if (statebit == off) { 
        power.invalidateDrawable(getResources().getDrawable(R.drawable.acoffdormant)); 
        power.setImageResource(R.drawable.acondormant); 
       } else { 
        power.invalidateDrawable(getResources().getDrawable(R.drawable.acondormant)); 
        power.setImageResource(R.drawable.ac_fan); 
       } 

А также:

 if (power.getBackground().getConstantState().equals 
       (getResources().getDrawable(R.drawable.acoffdormant).getConstantState())) 

И мой XML:

<LinearLayout 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_weight="1" 
         android:orientation="vertical" > 

         <TextView 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center" 
          android:layout_marginBottom="10dp" 
          android:layout_marginTop="20dp" 
          android:background="@android:color/transparent" 
          android:text="@string/power" 
          android:textColor="#00CCCC" 
          android:textSize="20dp" 
          android:textStyle="bold" /> 

         <ImageButton 
          android:id="@+id/power" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center" 
          android:layout_weight="1" 
          android:clickable="true" 
          android:adjustViewBounds="true" 
          android:background="@android:color/transparent" 
          android:scaleType="centerInside" 
          android:src="@drawable/acoffdormant" /> 
</LinearLayout> 
+0

увидеть это http://stackoverflow.com/questions/4526585/imageview-drawable-id-in-android –

+0

Вам не нужно возиться с Bitmaps. setImageResource() самостоятельно выполнит эту работу. –

ответ

1

Вы можете использовать имеющиеся tag attribute для imageButton ..

По умолчанию в вашем XML дает тег как от ..

<ImageButton 
          android:id="@+id/power" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center" 
          android:layout_weight="1" 
          android:clickable="true" 
          android:adjustViewBounds="true" 
          android:background="@android:color/transparent" 
          android:scaleType="centerInside" 
          android:src="@drawable/acoffdormant" 
          android:tag="off" /> 

Затем по нажатию кнопки:

public void onClick(View v) { 

String tag = power.getTag().toString().trim(); 

if(tag.equals("off")) 
{ 
    power.setImageResource(R.drawable.acondormant); 
    power.setTag("on"); 
} 
else if(tag.equals("on")) 
{ 
    power.setImageResource(R.drawable.acoffdormant); 
    power.setTag("off"); 
} 


    } 
}; 
+0

наконец-то, что-то работает – MRefaat

+0

@MRefaat рад, что он сработал :) – Hariharan

1

Вы пробовали:

power.setBackgroundResource(R.drawable.yourResource)

удалить также фоновый ресурс из XML

удалить android:src="@drawable/acoffdormant"

Вместо Set

power.setBackgroundResource(R.drawable.acoffdormant) // в OnCreate

+0

Да, я также пробовал это раньше, вообще он держит старый pic и делает новый под ним – MRefaat

+0

удаляет фоновый ресурс из xml, если вы установите так –

2

Вы можете использовать селектор, чтобы изменить изображение Кнопка/кнопка динамически

Selector.xml

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

Или вы можете установить visibilty в Gone/VISIBLE на нажатие кнопки

0

Все, что вам нужно сделать, это вызов invalidate():

power.invalidate(); 

или

power.postInvalidate(); 

после if-else блок только в конце метода.

+0

, он отлично работает в сравнении, но он меняет изображение без удаления оригинала ресурс, поэтому он дает мне комбинированные изображения – MRefaat

1

Есть два способа сделать это.

А другой - с помощью переносного селектора, как упомянуто в его ответе AndroidHacker.

2

Используйте один переменный флаг, как это,

boolean flag = false; 

    public void onClick(View v) { 

    if(v == power) { 

     if (boolean) { 
      power.setImageResource(R.drawable.acondormant); 
      boolean = false; 
     } else { 
      power.setImageResource(R.drawable.acoffdormant); 
      boolean = true; 
     } 

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