2013-06-16 13 views
12

Mam projekt szkolny, w którym próbuję uruchomić aplikację latarki. Dla włączania/wyłączania ImageButton, chcę mieć 4 niestandardowe obrazy.Jak programowo zmienić docelowy src ImageButton po spełnieniu warunku?

Jeśli latarka jest wyłączona: -turn_on.png (domyślnie) -turn_on_pressing.png (stan wciśnięty = true)

Jeśli latarka jest włączona: -turn_off.png (domyślnie) -turn_off_pressing.png (stan wciśnięty = true)

Mam nadzieję, że zmienię docelowy src ImageButton, aby zmienić między "on_selector.xml" i "off_selector.xml". Pierwotnie udało mi się zmienić domyślne obrazy przycisków na setImageResource(). A teraz, gdy próbuję dodać moje własne do obrazów prasowych, mam bardzo trudny czas.

Application.java:

import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.view.View; 
import android.widget.ImageButton; 
import com.jrr.flashlight.R; 

public class Application extends Activity { 

    ImageButton flashControl; 
    Camera camera; 
    Parameters params; 

    private boolean hasFlash; 
    private boolean isFlashOn = false; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.application_layout); 

     flashControl = (ImageButton) findViewById(R.id.flashButtonOn); 
     flashControl.setOnClickListener(flashControlListener()); 

     hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); //sets value for boolean hasFlash 

    } 


    private View.OnClickListener flashControlListener() { 
     return new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       if (!isFlashOn){ 
        findViewById(R.id.appbackground).setBackgroundColor(Color.WHITE); 

        if(hasFlash){ 
         params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
         camera.setParameters(params); 
         camera.startPreview(); 
        } 
        isFlashOn = true; 
       } else { 
        findViewById(R.id.appbackground).setBackgroundColor(Color.BLACK); 

        if(hasFlash){ 
         params.setFlashMode(Parameters.FLASH_MODE_OFF); 
         camera.setParameters(params); 
         camera.stopPreview(); 
        } 
        isFlashOn = false; 
       } 

      } 
     }; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume();  
     camera = Camera.open(); 
     params = camera.getParameters(); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause();  

     if(camera!=null) { 
      camera.release(); 
      camera = null; 
     } 
     findViewById(R.id.appbackground).setBackgroundColor(Color.BLACK); 
    } 

application_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/appbackground" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:padding="0dp" 
       android:layout_margin="0dp" 
       android:background="#000000"> 

    <ImageButton 
      android:background="#80000000" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      <!--I want to be able to change the following line--> 
      android:src="@drawable/on_selector" 
      android:id="@+id/flashButtonOn" android:layout_gravity="center"/> 
</LinearLayout> 

on_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
      android:drawable="@drawable/turn_on_pressing" /> <!-- pressed --> 
    <item android:drawable="@drawable/turn_on" /> <!-- default --> 
</selector> 

off_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
      android:drawable="@drawable/turn_off_pressing" /> <!-- pressed --> 
    <item android:drawable="@drawable/turn_off" /> <!-- default --> 
</selector> 

Czy to, co chcę zrobić, nawet jeśli jest to możliwe, czy istnieje inny sposób, aby to osiągnąć? Utknąłem na tym przez około 3 godziny i nie mogę znaleźć odpowiedzi online w dowolnym miejscu (może nie zadając właściwego pytania?), Więc każda pomoc jest doceniana!

Dzięki!

Odpowiedz

17

Czy jest to wymaganie, że musi to być imageResource? Zamiast tego możesz spróbować użyć backgroundResource.

ImageButton flashButtonOn = (ImageButton) findViewById(R.id.flashButtonOn); 
flashButtonOn.setBackgroundResource(R.drawable.on_selector); 

Lub spróbuj

flashButtonOn.setImageResource(R.drawable.replacementGraphic); 
+0

bardzo dziękuję za szybką odpowiedź i rozwiązanie. Ustawienie odwołania do xml "ImageButton" w "tle" zamiast "src" zrobiło wielką różnicę. –

15

To powinno być "setImageResource", "setBackgroundResource" zmienia tło, a nie SRC. btn_MyButton.setImageResource (R.drawable.button_bg_selector_collapsed);

6

Podczas ustawiania obrazu stosując następujący atrybut:

android:src="@drawable/on_selector"

Trzeba będzie korzystać z następujących czynności, aby zmienić obraz dynamicznie:

ImageButton myButton = (ImageButton) findViewById(R.id.my_button); 
myButton.setImageResource(R.drawable.my_button_image); 
Powiązane problemy