2013-06-16 8 views
12

Ich habe ein Schulprojekt, wo ich versuche, eine Taschenlampe App gehen zu lassen. Für den On/Off ImageButton möchte ich 4 benutzerdefinierte Bilder haben.Wie programmiere ich programmgesteuert das ImageButton-src-Ziel, wenn eine Bedingung erfüllt ist?

Wenn Taschenlampe ist aus: -turn_on.png (default) -turn_on_pressing.png (Zustand gedrückt = true)

Wenn Taschenlampe auf: -turn_off.png (default) -turn_off_pressing.png (Zustand gedrückt = wahr)

Ich hoffe, das ImageButton src Ziel zu ändern, um zwischen "on_selector.xml" und "off_selector.xml" zu ändern. Ursprünglich war ich in der Lage, setImageResource() die Standardschaltflächenbilder zu ändern. Und jetzt, da ich versuche, meine eigenen Bilder in die Presse einzufügen, habe ich eine sehr schwierige Zeit.

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> 

Ist das, was ich tun möchte, sogar möglich oder gibt es einen anderen Weg, dies zu erreichen? Ich bin seit ungefähr 3 Stunden daran fest und kann die Antwort nirgendwo online finden (vielleicht nicht die richtige Frage?), So dass jede Hilfe geschätzt wird!

Danke!

Antwort

17

Ist es eine Voraussetzung, dass es imageResource sein muss? Sie können stattdessen versuchen, backgroundResource zu verwenden.

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

Oder versuchen

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

Vielen Dank für die schnelle Antwort und Lösung. Das Festlegen der 'ImageButton' XML-Referenz in 'Hintergrund' statt 'src' machte den Unterschied. –

15

Es sollte den Hintergrund "setImageResource", "setBackgroundResource" ändert, nicht die src. btn_MyButton.setImageResource (R.drawable.button_bg_selector_collapsed);

6

Wenn das Bild Einstellen des folgenden Attribut:

android:src="@drawable/on_selector"

Sie verwenden müssen dynamisch das Bild folgendes zu ändern:

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