2016년 8월 31일 수요일

[안드로이드] alertdialog에서 입력받은 값을 fragment에 전달하기



AlertDialog를 이용하여 유저의 입력 값을 화면에 갱신코자 할 때 일반적인 Activity의 경우 바로 갱신이 되지만 프래그먼트의 경우 별도로 처리 해 줄 필요가 있습니다.

먼저 프래그먼트가 속한 activity에 DialogInterface.OnDismissListener를 implements 합니다.

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, DialogInterface.OnDismissListener

다음으로 해당 Activity에서 onDismiss 메소드를 override합니다.

    @Override
    public void onDismiss(DialogInterface dialog){
        Fragment fragment = ((PagerAdapter) viewPager.getAdapter()).getItem(0);
        if(fragment!=null){
            fragment.onResume();
        }
    }

onDimiss에서 fragment의 onResume을 호출 하는 방식입니다.
상기 코드는 viewPager로 만든 프래그먼트이기 때문에 getItem으로 해당 fragment를 특정하는 방식으로 fragment를 지정했습니다.

마지막으로 AlertDialog에 setOnDimissListner를 붙여서 AlertDialog가 dimiss 될 때 Activity의 ondimiss를 호출 하도록 합니다.

AlertDialog ad = new AlertDialog.Builder(getActivity()).setTitle("선택하세요.")
                .setSingleChoiceItems(result, -1, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mSelectedString = mResult.get(which);        //선택하면 해당 글자 저장
                    }
                })
                .setPositiveButton("확인", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        aaa=mSelectedString;
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("취소", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        aaa=null;
                        mSelectedString = null;
                    }
                }).create();
        ad.show();
        ad.setOnDismissListener((DialogInterface.OnDismissListener)getActivity());

이렇게 하면 fragment의 onResume을 호출하게 되고 OnResume에 필요한 코드를 넣으면 해당하는 동작을 하게 됩니다. 참고로 저는 AlertDialog에서 받은 값을 EditText에 표시 되도록 하려고 했는데 이런식으로 onResume으로 돌아올 경우 EditText의 id값이 없어지더군요. 그래서 EditText 선언 할 때 static으로 변경해서 해결했습니다.

댓글 없음:

댓글 쓰기