web-dev-qa-db-ja.com

条件が満たされたときに、プログラムでImageButton srcターゲットを変更するにはどうすればよいですか?

懐中電灯アプリを動かそうとしている学校のプロジェクトがあります。オン/オフのImageButtonには、4つのカスタム画像が必要です。

懐中電灯がオフの場合:-turn_on.png(デフォルト)-turn_on_pressing.png(押された状態= true)

懐中電灯がオンの場合:-turn_off.png(デフォルト)-turn_off_pressing.png(押された状態= true)

ImageButtonsrcターゲットを「on_selector.xml」と「off_selector.xml」の間で変更するように変更したいと思っています。もともと私はsetImageResource()でデフォルトのボタン画像を変更することができました。そして今、私は自分のプレス画像を追加しようとしているので、非常に苦労しています。

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>

私がやりたいことは可能ですか、それともこれを達成する別の方法がありますか?私はこれに約3時間立ち往生していて、どこでもオンラインで答えを見つけることができません(おそらく正しい質問をしていませんか?)ので、どんな助けもありがたいです!

ありがとう!

15
John Riggs

ImageResourceである必要がありますか?代わりにbackgroundResourceを使用してみてください。

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

または試してみてください

flashButtonOn.setImageResource(R.drawable.replacementGraphic);
23
Chor Wai Chun

「setImageResource」である必要があります。「setBackgroundResource」は、srcではなく背景を変更します。 btn_MyButton.setImageResource(R.drawable.button_bg_selector_collapsed);

17

次の属性を使用して画像を設定する場合:

Android:src="@drawable/on_selector"

画像を動的に変更するには、以下を使用する必要があります。

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