ارسال دیتا از فرگمنت به اکتیویتی
جمعه, ۱۶ آبان ۱۳۹۹، ۰۲:۳۹ ق.ظ
برای ارسال دیتا "از فرگمنت" "به اکتیویتی" دو تا راه وجود داره:
1. راه بد و آسان:
فراخونی اکتیویتی توسط getActivity و صدا کردن ویوی مورد نظر (مثلا تکست ویو) و نوشتن اطلاعات در آن. در این حالت ویو حتما باید پابلیک باشد.
2. راه خوب همراه با کمی چالش:
استفاده از اینترفیس در حالی که اکتیویتی آن را پیاده سازی کرده باشد.
2. اول کد راه دوم بررسی میشه.
کد اکتیویتی
public class MainActivity extends AppCompatActivity implements DialogFragment.DataSendListener {
TextView txt_show_text;
Button btn_showFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt_show_text = findViewById(R.id.txt_show_text);
btn_showFrag = findViewById(R.id.btn_showFrag);
btn_showFrag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialogFragment = new DialogFragment();
dialogFragment.show(getSupportFragmentManager(), "myDialog");
}
});
}
@Override
public void dataSend(String data) {
txt_show_text.setText(data);
}
}
کد دیالوگ فرگمنت
public class DialogFragment extends androidx.fragment.app.DialogFragment {
//تعریف یک اینترفیس که توسط اکتیویتی پیاده سازی میشه و دیتا رو توی تکست ویو ست میکنه
public interface DataSendListener {
void dataSend(String data);
}
EditText edt_name;
Button btnOk;
DataSendListener dataSendListener;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dialog, container, false);
edt_name = view.findViewById(R.id.edt_name);
btnOk = view.findViewById(R.id.btnOk);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dataSendListener.dataSend(edt_name.getText().toString());
getDialog().dismiss();
}
});
return view;
}
// برای جلوگیری از لیک شدن مموری اینترفیس باید در متد آن اتچ مقداردهی بشه
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
dataSendListener = (DataSendListener) context;
try {
} catch (ClassCastException e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
1. در این حالت متد onCreateView در فرگمنت به صورت زیر تغییر میکنه و دیگه نیازی به لیسنر نیست.
توی این کد اکتیویتی رو فراخونی کردیم و ویوی مورد نظر کال شده.
این روش خوبی نیست، چون نمیشه تعمیمش داد و حرفه ای نمی باشد!
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dialog, container, false);
edt_name = view.findViewById(R.id.edt_name);
btnOk = view.findViewById(R.id.btnOk);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((MainActivity) getActivity()).txt_show_text.setText(edt_name.getText().toString());
getDialog().dismiss();
}
});
return view;
}
خروجی در هر دو حالت:
۹۹/۰۸/۱۶