Hello, 나나's world !
dialogFragment 에서 Fragment 로 데이터 전달 본문
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