آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

طبقه بندی موضوعی

ارسال دیتا از فرگمنت به اکتیویتی

جمعه, ۱۶ آبان ۱۳۹۹، ۰۲:۳۹ ق.ظ

برای ارسال دیتا "از فرگمنت" "به اکتیویتی" دو تا راه وجود داره:

 

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;
    }

خروجی در هر دو حالت:

 

 

 

 

موافقین ۰ مخالفین ۰ ۹۹/۰۸/۱۶
میم دال

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی