2013-06-16 13 views
12

Ho un progetto scolastico in cui sto cercando di far funzionare un'app torcia. Per l'attivazione/disattivazione di ImageButton, voglio avere 4 immagini personalizzate.Come si modifica a livello di codice la destinazione SRBC ImageButton quando viene soddisfatta una condizione?

Se torcia è spento: -turn_on.png (default) -turn_on_pressing.png (stato premuto = true)

Se torcia è su: -turn_off.png (default) -turn_off_pressing.png (stato premuto = vero)

Spero di cambiare il target src ImageButton per cambiare tra "on_selector.xml" e "off_selector.xml". Inizialmente ero in grado di setImageResource() per cambiare le immagini dei pulsanti predefinite. E ora che sto cercando di aggiungere il mio sulle immagini della stampa, sto attraversando un momento molto difficile.

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> 

È quello che voglio fare anche se è possibile o c'è un altro modo per farlo? Sono rimasto bloccato su questo per circa 3 ore e non riesco a trovare la risposta online da qualche parte (forse non facendo la domanda giusta?) Quindi ogni aiuto è apprezzato!

Grazie!

risposta

17

È necessario che sia imageResource? Puoi provare a utilizzare backgroundResource.

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

Oppure provate

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

ringrazio molto per la risposta rapida e soluzione. L'impostazione del riferimento xml 'ImageButton' in 'background' piuttosto che 'src' ha fatto la differenza. –

15

dovrebbe essere "setImageResource", "setBackgroundResource" cambia lo sfondo, non lo src. btn_MyButton.setImageResource (R.drawable.button_bg_selector_collapsed);

6

Quando si imposta l'immagine utilizzando il seguente attributo:

android:src="@drawable/on_selector"

Sarà necessario utilizzare la seguente per cambiare l'immagine in modo dinamico:

ImageButton myButton = (ImageButton) findViewById(R.id.my_button); 
myButton.setImageResource(R.drawable.my_button_image); 
Problemi correlati