2016-06-29 3 views
-1

onActivityResult 메소드 내에서 ImageView에서 이미지를 검색 한 후 전화로 이미지를 표시하려고합니다. OnCreate 메서드 바로 전에 ImageView를 선언했습니다. 레이아웃에서 ID로 찾은 다음 마지막으로 선택한 이미지를 표시하려고합니다. 그러나 imgPreview는 여전히 회색이며 "개인 필드 ImageView가 할당되지 않았습니다"라는 메시지를 볼 수 있습니다. onActivityResult 내에서 imgPreview에 비트 맵을 설정하는 동안 참조 문제는 발생하지 않지만Android : ImageView.setImageBitmap을 사용하는 NullPointerException

픽업 활동에서 주 활동으로 돌아가는 동안이 앱을 디버깅하려고 할 때 java.lang.NullPointerException이 발생합니다. 신고 한 경우

ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

OnActivityResult 내에 추가로 오류가 발생하지 않습니다. 왜 그런 일이 일어 났는지 설명 할 수 있습니까? 방법을 사용할 때마다 매번 imgPreview를 찾아야합니까? 전체 코드 조각은 아래에 있습니다.

public class MainActivity extends AppCompatActivity implements TaskComplete { 

private static final int BROWSE_PIC_REQUEST_CODE = 300; 
private ImageView imgPreview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 
} 


public void onClick3(View view) { 

    Intent i = new Intent(
      Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    startActivityForResult(i, BROWSE_PIC_REQUEST_CODE); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == BROWSE_PIC_REQUEST_CODE && resultCode == RESULT_OK) { 

     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 

     options.inSampleSize = 4; 


     try { 

       imgPreview.setImageBitmap(BitmapFactory.decodeFile(picturePath,options));} 
     catch (Exception e) { 
      Log.e("test",e.toString()); 
     } 

    else { some code }; 



} 
+0

'imgPreview'와 같은 이름의 로컬 변수와 전역 변수가 있습니다. 로컬 선언을 제거하십시오. 그것은 잘 작동합니다. –

+0

나는 이미 그것을 얻었다. 고맙습니다. –

+0

@KNeerajLal 변수에 전역 범위 (public/static이 아님)가 없으며 인스턴스 변수입니다. –

답변

2
ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

는 여기에서 다시 선언하는 imgPreview을. 해당 줄의 시작 부분에서 ImageView을 제거하면 제대로 작동합니다. 그래서 :

imgPreview = (ImageView) findViewById(R.id.imageView); 

는 올바르게 클래스 수준 imgPreview를 참조합니다.

2

에서 :

ImageView imgPreview = (ImageView) findViewById(R.id.imageView); 

제거 :

ImageView 

인스턴스 변수가 정의되지 않습니다, 당신은 onCreate()에서 지역 변수를 정의했습니다.

관련 문제