Hello, 나나's world !

dialogFragment 에서 Fragment 로 데이터 전달 본문

💚 Android

dialogFragment 에서 Fragment 로 데이터 전달

Nana0 2021. 1. 18. 23:15

 

 

 

DialogFragment 에서 Fragment로 선택한 스피너 값을 전달해 주려고 한다.

interface를 사용하여 값을 넘겨줄 것이다.

 

 

1.LetterReciverDialog

public class LetterReceiverDialog extends DialogFragment {

    public static final String TAG_EVENT_DIALOG = "dialog_event";

    public LetterReceiverDialog(){}

    public static LetterReceiverDialog getInstance(){
        LetterReceiverDialog letterReceiverDialog = new LetterReceiverDialog();
        return letterReceiverDialog;
    }

    //LetterWriteFragment에 데이터를 넘겨주기 위한 인터페이스
    public interface MyFragmentInterfacer {
        void onButtonClick(String input);
    }

    private MyFragmentInterfacer fragmentInterfacer;


    public void setFragmentInterfacer(MyFragmentInterfacer fragmentInterfacer){
        this.fragmentInterfacer = fragmentInterfacer;
    }


    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.dialog_letter_receiver, container);
        final Spinner mSpinner = (Spinner)v.findViewById(R.id.dialog_receiver);

        //스피너 String-array와 연동
        ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_spinner_item,
                getResources().getStringArray(R.array.member_call));
        mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(mAdapter);

        Button mCancleBtn = (Button)v.findViewById(R.id.dialog_receiver_cancle_btn);

        //확인버튼 누를시 스피너 값 LetterWriteFragment에 전달
        Button mOkBtn = (Button)v.findViewById(R.id.dialog_receiver_ok_btn);
        mOkBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            
//                Toast.makeText(getContext(), "test.", Toast.LENGTH_SHORT).show();
                 //선택한 스피너값 String으로 받기
                String input = mSpinner.getSelectedItem().toString();
                fragmentInterfacer.onButtonClick(input);
                getDialog().dismiss();
            }

        });
        
        mCancleBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getDialog().dismiss();
            }
        });
        
//        화면터치시 꺼짐 막기
        setCancelable(false);

        return v;
    }

}

 1. 버튼 리스너를 일일히 달아주기에는 코드가 지저분할수 있어 View.onClickListener() 를 implement 하여 

 onClick() {} 밑에다가 조건문으로 달아주어도 좋다.  

 

 2. 필자는 this.fragmentInterfacer = fragmentInterfacer;  로 직접 지정해줌

 

2.LetterWriteFragment.java

public class LetterWriteFragment extends Fragment {

    private static final String TAG = "LetterWriteFragment";

    private MainActivity mainActivity;
    private View mContentView;
    private ImageButton mAddReciverBtn;
    private TextView mToTv, mWriteDate;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (container == null)
            return null;

        if (inflater == null)
            return null;

        mainActivity = (MainActivity) getActivity();

        mContentView = inflater.inflate(R.layout.fragment_letter_write, container, false);

        init(mContentView);

        return mContentView;

    }


    public void init(View v) {
        if (v != null) {

            mToTv = mContentView.findViewById(R.id.f_letter_receiever_tv);
            mAddReciverBtn = mContentView.findViewById(R.id.f_receiver_add_img_btn);


            //받는이 선택하기 다이얼로그 띄우기
            mAddReciverBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    LetterReceiverDialog mletterdlg = LetterReceiverDialog.getInstance();
                    mletterdlg.setFragmentInterfacer(new LetterReceiverDialog.MyFragmentInterfacer() {
                        @Override
                        //인터페이스 값 받아오기
                        public void onButtonClick(String input) {
                            mToTv.setText(input);
                        }
                    });
                    mletterdlg.show(getFragmentManager(), LetterReceiverDialog.TAG_EVENT_DIALOG);

                }
            });

}


3. 클래스를 implements LetterReceiverDialog.MyFragmentInterfacer 해주고 onButtonClick() 함수를 따로 빼주었더니  Null 발생...  -> 다이얼로그 띄워주는곳 안에 값을 받아오는걸로 구현해 주었다.

 

 

 

 

 


<개발환경>

java version "1.8.0_271"

android API 10.0.0+ (R)

android studio "4.0.1"

 

 

'💚 Android' 카테고리의 다른 글

Android Wave효과 넣기 WaveView  (0) 2021.01.20
Fragment의 RecyclerView 에서 Fragment로 데이터 전달하기  (0) 2021.01.20
onDraw() 를 활용하여 그림그리기  (0) 2021.01.08
RecyclerView  (0) 2021.01.08
DialogFragment  (0) 2021.01.07
Comments