마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Null의 원인을모르겠습니다(startActivityForResult )

0 추천

다이얼로그 창을 하나 생성한다음, 이미지를 불러오기 위하여 버튼을 눌럿을 때 이미지를 선택하는 창을 불러오게 하려고 했는데 버튼을 누르면 NullPointerException이 납니다..

아래는 소스코드입니다.

public class NewBucketDialog extends AppCompatActivity {
    private static final int PICK_FROM_ALBUM = 0;
    private static final int CROP_FROM_IMAGE = 1;
    private Context mContext;
    private ImageView bucketImage;
    private Uri imgUri;
    private String absolutePath;
    private Realm realm;


    public NewBucketDialog(Context context)
    {
        this.mContext = context;
        realm = Realm.getDefaultInstance();
    }

    public void buildAndShowInputBucketDialog(){
        Log.d("TAG", "buildAndShowInputBucketDialog called!!");
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle("Add A Bucket");

        LayoutInflater li = LayoutInflater.from(mContext);
        View dialogView = li.inflate(R.layout.bucket_add_dialog_view, null);
        final Button imgSelectBtn = (Button) dialogView.findViewById(R.id.dialog_select_imagebtn);
        final Spinner bucketCategory = (Spinner) dialogView.findViewById(R.id.dialog_select_category);
        final EditText bucketTitle = (EditText) dialogView.findViewById(R.id.dialog_edit_bucket_title);
        final EditText bucketPrice = (EditText) dialogView.findViewById(R.id.dialog_edit_bucket_price);
        bucketImage = (ImageView) dialogView.findViewById(R.id.dialog_image_view);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext
                , android.R.layout.simple_spinner_item
                , mContext.getResources().getStringArray(R.array.categories));

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        bucketCategory.setAdapter(adapter);
        bucketCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                bucketPrice.setText("");
                if(position == 2)
                    bucketPrice.setVisibility(View.VISIBLE);
                else if(position == 1 || position == 3)
                    bucketPrice.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) { }
        });

        imgSelectBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
                Log.d("TAG", "imgSelectBtn Onclick");
                startActivityForResult(intent, PICK_FROM_ALBUM);

            }
        });

        builder.setView(dialogView);
        builder.setPositiveButton("추가", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                addBucket(bucketCategory.getSelectedItemPosition()
                        , bucketTitle.getText().toString()
                        , bucketPrice.getText().toString()
                        , ((BitmapDrawable) bucketImage.getDrawable()).getBitmap());
            }
        });
        builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        final AlertDialog dialog = builder.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("TAG", "new bucket, onActivityResult call!1");

        if(resultCode != RESULT_OK) return;

        switch (requestCode){
            case PICK_FROM_ALBUM:
                break;
            case CROP_FROM_IMAGE:
                break;
        }
    }
}

 

그리고 이건 에러 로그입니다.

06-05 09:17:33.639 17643-17643/bibucketlist.com.mybucketlist D/TAG: buildAndShowInputBucketDialog called!!
06-05 09:17:34.890 17643-17643/bibucketlist.com.mybucketlist D/TAG: imgSelectBtn Onclick
06-05 09:17:34.890 17643-17643/bibucketlist.com.mybucketlist D/AndroidRuntime: Shutting down VM
06-05 09:17:34.890 17643-17643/bibucketlist.com.mybucketlist E/AndroidRuntime: FATAL EXCEPTION: main
 Process: bibucketlist.com.mybucketlist, PID: 17643                                                           
java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread 
android.app.ActivityThread.getApplicationThread()' on a null object reference                                                                                   
at android.app.Activity.startActivityForResult(Activity.java:4226)                                                                                   
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)                                                                                   
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)                                                                                   
at android.app.Activity.startActivityForResult(Activity.java:4183)                                                                                   
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)                                                                                   
at bibucketlist.com.mybucketlist.dialog.NewBucketDialog$2.onClick(NewBucketDialog.java:94)                                                                                   
at android.view.View.performClick(View.java:5637)                                                                                   
at android.view.View$PerformClick.run(View.java:22429)                                                                                   
at android.os.Handler.handleCallback(Handler.java:751)                                                                                   
at android.os.Handler.dispatchMessage(Handler.java:95)                                                                                   
at android.os.Looper.loop(Looper.java:154)                                                                                             
at android.app.ActivityThread.main(ActivityThread.java:6119)                                                                                   
at java.lang.reflect.Method.invoke(Native Method)                                                                                   
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)                                                                                   
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

 

 

익명사용자 님이 2017년 6월 7일 질문

1개의 답변

0 추천
  • activity 는 어떻게 call 하셨는지요?
  • buildAndShowInputBucketDialog 는 어디서 call 되나요?

 

aucd29 (218,390 포인트) 님이 2017년 6월 7일 답변
해당클래스는 메인액티비티에서
NewBucketDialog dialog = new NewBucketDialog(MainActivity.this);
이런식으로 호출하고 있습니다.

((Activity)mContext).startActivityForResult(intent, PICK_FROM_ALBUM)
이렇게하면 이미지선택창은 뜨지만 이미지를 선택했을때 다시 다이얼로그창으로 돌아오고 onActivityResult 메소드가 호출이 안되네요..
일단 activity 는 new 로 호출하는게 아닙니다.
사용법 자체가 잘못되었으니 일단 관련 내용 검색부터 해보세요
알려주신대로 Intent를 이용하여 activity를 호출하니까 됩니다.
다만 메인 액티비티에서
Intent intent = new Intent(MainActivity.this, NewBucketDialog.class);            startActivity(intent);
이런식으로 호출을 하였는데 기존 activity위에 dialog창을 띄우는게 아닌 새로운 activity가 생기고 그 위에 dialog창이 떠버립니다. 기존 activity에 dialog창을 띄우려면 어떻게 해야 할까요..??
커스텀 Dialog 를 만들어야 하는데 커스텀 Activity 를 만들고 그 안에 Dialog 를 만들어서 그럽니다. 커스텀 Dialog 를 만드는 법을 검색하시고 그걸 사용해보세요
...