2012-03-29 17 views
0

私はonTouchListenerをImageViewに追加しようとしているので、ユーザーが画像から選択したピクセルの値を取得できます。したがって、私は主なアクティビティでonTouchListenerを実装し、それをImageViewイメージビューのonTouchListenerとして使用しました。.setOnTouchListener()でnullpointerexceptionが発生するのはなぜですか?

次のように私のコードは次のとおりです。

package com.andrew.omnidropper; 

import java.io.File; 
import java.net.URI; 

import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class OmniDropperActivity extends Activity implements OnTouchListener { 
protected static final int TAKE_PICTURE_INTENT = 0; 
protected static final int SELECT_PREVIOUS_PHOTO_INTENT = 1; 
/** Called when the activity is first created. */ 

public Button cameraButton; 

public ImageView imageview; 
public ImageView colordisplay; 

private Bitmap bitmap; 

private Uri imageUri; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    cameraButton = (Button) findViewById(R.id.camerabutton); 
    imageview = (ImageView) findViewById(R.id.imageview); 
    colordisplay = (ImageView) findViewById(R.id.colordisplay); 

    cameraButton.setOnClickListener(clickListener); 
    imageview.setOnTouchListener(this); 
} 
OnClickListener clickListener = new OnClickListener() { 
    public void onClick(View v) { 
     if(v.getId() == R.id.camerabutton){ 
      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
      File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, 
        Uri.fromFile(photo)); 
      imageUri = Uri.fromFile(photo); 
      startActivityForResult(intent, 0); 
      setContentView(R.layout.selectcolorspot); 
     } 
     /*if(v.getId() == R.id.imagebutton){ 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent, "Select Picture"), 
        SELECT_PREVIOUS_PHOTO_INTENT); 
      setContentView(R.layout.selectcolorspot); 
     }(*/ 
     /*if(v.getId() == R.id.scratchbutton){ 
      setContentView(R.layout.makenewcolor); 
     }*/ 
    } 
}; 
private int colorPicked; 

public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
     case 0: 
      if (resultCode == Activity.RESULT_OK) { 
       Uri selectedImage = imageUri; 
       getContentResolver().notifyChange(selectedImage, null); 
       imageview = (ImageView) findViewById(R.id.imageview); 
       ContentResolver cr = getContentResolver(); 
       try { 
        bitmap = android.provider.MediaStore.Images.Media 
         .getBitmap(cr, selectedImage); 

        imageview.setImageBitmap(bitmap); 
        imageview.setScaleType(ImageView.ScaleType.FIT_XY); 
        Toast.makeText(this, "Select an point on the image and press OK", 
            Toast.LENGTH_LONG).show(); 
       } catch (Exception e) { 
        Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
         .show(); 
        Log.e("Camera", e.toString()); 
       } 
      } 
    } 
} 

public boolean onTouch(View v, MotionEvent e) { 
    if(v.getId() == R.id.imageview){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN && bitmap != null){ 
      colorPicked = bitmap.getPixel((int) e.getX(),(int) e.getY()); 
      setContentView(R.layout.iscolorok); 
      colordisplay.setBackgroundColor(colorPicked); 
     } 
    } 
    return false; 
} 
} 

が、私はそれを実行しようとすると、それがクラッシュします。

ここでlogcat出力です:

03-28 20:43:54.613: D/AndroidRuntime(4761): Shutting down VM 
03-28 20:43:54.613: W/dalvikvm(4761): threadid=1: thread exiting with uncaught exception (group=0x40018560) 
03-28 20:43:54.621: E/AndroidRuntime(4761): FATAL EXCEPTION: main 
03-28 20:43:54.621: E/AndroidRuntime(4761): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.andrew.omnidropper/com.andrew.omnidropper.OmniDropperActivity}: java.lang.NullPointerException 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1716) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread.access$1500(ActivityThread.java:124) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.os.Looper.loop(Looper.java:123) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread.main(ActivityThread.java:3806) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at dalvik.system.NativeStart.main(Native Method) 
03-28 20:43:54.621: E/AndroidRuntime(4761): Caused by: java.lang.NullPointerException 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at com.andrew.omnidropper.OmniDropperActivity.onCreate(OmniDropperActivity.java:47) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660) 
03-28 20:43:54.621: E/AndroidRuntime(4761):  ... 11 more 
03-28 20:43:59.519: I/Process(4761): Sending signal. PID: 4761 SIG: 9 

私はそれを宣言するためImageViewのがnullではないと思いますが、なぜそれがNullPointerExceptionがスローでしょうか?

+0

[API](http://developer.android.com/reference/android/app/Activity.html)、public View findViewById(int id)をチェックすると、このメソッドは見つかった場合はビューを返し、そうでない場合はnullを返します。 。 – yorkw

+0

imageviewがnullではないことを_確認しましたか?確認するには1行のコードしか必要ありません。また、あなたは_declare_ imageviewのようには見えません。 _findViewById_によって返されるようです。 – jahroy

答えて

4

あなたの画像ビューはおそらくnullです。 findViewByIdメソッドは、ビューが見つからない場合はnullを返します。フェッチしようとしているImageViewがmainレイアウトで定義されていますか?私はデバッガを使ってそれを調べ、imageviewがヌルかどうかを確認します。

+0

それは私のメインレイアウトではない、それは "iscolorok"と呼ばれる別のレイアウトにあるので、ここで問題を引き起こしている可能性がありますか? – user1060828

+3

問題を引き起こしていない...それが問題です。 setContentView(R.layout.main)を呼び出すと、main.xmlのすべてのビューを画面に表示するように指示します。別のアクティビティでsetContentView(R.layout.iscolorok)に伝えたい場合は、findViewById()を使用してそのImageViewへの参照を取得できます。単純に:異なるレイアウトの場合は、画面外にあり、findViewById()を使用して相互作用するための参照を取得することはできません。 – FoamyGuy

+0

だから私はsetOnTouchListenerとfindByViewIdを、私がsetContentViewをiscolorokに置く場所に置くべきですか? – user1060828

関連する問題