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

다이얼로그 닫히는걸 체크하지를 못해요..

0 추천

프래그먼트에서 다이얼로그 프래그먼트를 띄우고 다이얼로그프래그먼트에서 프래그먼트로 데이터를 전달하면서 종료하는 기능을 만들고 있는데..

 

다이얼로그가 닫혔다는걸 체크하기위해서 onDismiss()를 사용하는데 자꾸 null 에러가나네요...원인을 도통 모르겠습니다..

다이얼로그 창을 띄우고 아이템을 클릭하면 팅겨버립니다..

데이터 전달을 못하는거면 차라리 이해라도 하겠는데 아이템 클릭 리스너에서 에러가나버리니 도저히

원인을 모르겠어요 ㅠㅠ

 

참고로 다이얼로그는 리사이클러뷰 아이템들로 구성되어있어요

 

프래그먼트에서 다이얼로그를 띄우는 기능과 닫혔을때 리스너 코드입니다.

//루틴 추가
        listAdapter.setOnAddRoutineClickListener(new RoutineListAdapter.OnAddRoutineClickListener() {
            @Override
            public void onAddRoutineClick() {
                WorkoutListDialogFragment routineDialog = new WorkoutListDialogFragment();
                routineDialog.show(getActivity().getSupportFragmentManager(), "RoutineListDialog");
                getParentFragmentManager().executePendingTransactions();
                routineDialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        String routine = getArguments().getString("routine");
                        onAddRoutine(routine);
                    }
                });
            }
        });

 

다이얼로그 아이템 클릭 이벤트입니다 (에러가 여기서 getParent()~~이부분을 가리켜요 (104번 라인)

workoutListAdapter.setOnWorkoutListClickListener(new WorkoutListAdapter.OnWorkoutListItemClickListener() {
            @Override
            public void OnItemClick(String routine) {
                Bundle bundle = new Bundle();
                bundle.putString("routine", routine);
                getParentFragment().setArguments(bundle);
                dismiss();
            }
        });

 

리사이클러뷰 아이템 클릭위한 뷰홀더입니다..

public class ViewHolder extends RecyclerView.ViewHolder {
        TextView workout_list_item;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            workout_list_item = itemView.findViewById(R.id.routine_list);
            workout_list_item.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.OnItemClick(workout_list_item.getText().toString());
                }
            });
        }
    }

69번라인 에러가 여기 이벤트에서 납니다

 

에러코드입니다

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.fragment.app.Fragment.setArguments(android.os.Bundle)' on a null object reference
        at com.example.writeweight.fragment.WorkoutListDialogFragment$2.OnItemClick(WorkoutListDialogFragment.java:104)
        at com.example.writeweight.adapter.WorkoutListAdapter$ViewHolder$1.onClick(WorkoutListAdapter.java:69)

 

추가로 이상한건.. 지금 코드에서는 onDismiss()를 onAddRoutineClick() 내에서 구현을 했지만,

이것을 클래스에서 DialogInterface를 implements하고 onDismiss()를 구현했을 경우에는

다이얼로그 창까지 열리고 아이템 선택했을때 에러가 납니다.. 똑같은 null에러가 나요..

 

무엇이 문제일까요 ㅠ

 

 

하.. 싱글액티비티로 바꾸겠다고 액티비티로 만들어놓을걸 프래그먼트로 변환중인데

이게 영 골치아픈게 아니네요..ㅠㅠ

 

 

codeslave (3,940 포인트) 님이 2021년 4월 8일 질문
codeslave님이 2021년 4월 8일 수정
setTargetFragment를 사용해 보세요.

1개의 답변

0 추천

setTargetFragment 사용하는 예제 코드입니다.

FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment dialogFragment = new DialogFragment();
dialogFragment.setTargetFragment(this, REQUEST_CODE);
dialogFragment.show();

private void sendResult(int REQUEST_CODE) {
    Intent intent = new Intent();
    intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString);
    getTargetFragment().onActivityResult(
        getTargetRequestCode(), REQUEST_CODE, intent);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == DialogFragment.REQUEST_CODE) {
        String editTextString = data.getStringExtra(
            DialogFragment.EDIT_TEXT_BUNDLE_KEY);
    ....
}

 

spark (224,800 포인트) 님이 2021년 4월 8일 답변
...