مشکل null بودن context زمان call کردن dialog از fragment

پرسیده شده
فعالیت 1279 روز پیش
دیده شده 650 بار
0

سلام چیزی که تو اموزش ها گفته شد دیالوگ از main activity کال میشه مشکلی ام نداره ولی وقتی جای main activity از fragment استفاده میشه زمانی که می خواد context گرفته شده از onAttach رو cast کنه به اینترفیسمون ، ارور میده انواع روش هارو امتحان کردم کلی سرچ کردم به نتیجه ای نرسیدم تو راهنما های سایت developer.android.com بخش مربوطشم گشتم چیزی پیدا نکردم شایدم خوب نگشتم.

فایل پیوست

معین سعادتمند
معین سعادتمند

12 آبان 99

0
حذف شده

سلام و احترام 

 

ممنون میشم عکسی از کدتون یا خود کد رو پیوست یا ارسال بفرمایید تا شما رو بهتر راهنمای کنم 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

12 آبان 99

حذف شده
سلام نیازی به کد نداره کاملا توضیح دادم این موضوع توی توضیحات فرگمنت هست نمی دونم چجوری باید حلش کنم. Caution: If you need a Context object within your Fragment, you can call getContext(). However, be careful to call getContext() only when the fragment is attached to an activity. When the fragment isn't attached yet, or was detached during the end of its lifecycle, getContext() returns null.
معین سعادتمند

12 آبان 99

حذف شده
بنظرم هنگامی که میخاید cast کنید بجای اینکه context(پارامتر مربوط به متد onAttach) رو به اینترفیستون بدید در اصل دارید متد getContext() رو به اینترفیستون میدید و این باعث ارور nullpointerException میشه. لطفا چک بفرمایید اگر این مورد نبود کدتونو ارسال کنید.
پوریا شفیعی

12 آبان 99

حذف شده
اصلا کد های بخش دیالوگ تغییری نداره میفرستم ببین. نتیجه ای که من بهش رسیدم اینه که قبلا onAttack چیزی که بر میگردونده Activity بوده ولی تو نسخه های بعد دیپریکیت شده و الان Context برمیگردونه که باعث شده این مشکل به وجود بیاد چنتا راه حلم داده بودن همرو امتحان کردم هیچکدوم کار نکردن.
معین سعادتمند

13 آبان 99

0
حذف شده
public class MyDialog extends BottomSheetDialogFragment {


    private static final String ARG_ITEM_COUNT = "item_count";

    DialogName dialogName;

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        dialogName= (DialogName) context;
    }
    

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_list, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        Button btn_ok=view.findViewById(R.id.btn_dialog_ok);
        Button btn_cancel=view.findViewById(R.id.btn_dialog_cancel);
        final EditText et_getName=view.findViewById(R.id.et_dialog_getName);

        btn_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(et_getName.length()>0){
                    dialogName.onClickOk(et_getName.getText().toString());
                    dismiss();
                }

            }
        });
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialogName.onClickCancel();
                dismiss();
            }
        });

    }
    public static MyDialog newInstance(int itemCount) {
        final MyDialog fragment = new MyDialog();
        final Bundle args = new Bundle();
        args.putInt(ARG_ITEM_COUNT, itemCount);
        fragment.setArguments(args);
        return fragment;
    }

    public interface DialogName{
        void onClickOk(String data);
        void onClickCancel();
    }
}
فایل پیوست

معین سعادتمند

توسط

معین سعادتمند

13 آبان 99

0
حذف شده
public class FragmentB extends Fragment implements MyDialog.DialogName{

    private TextView textView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_b, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
       
        textView=view.findViewById(R.id.tv_fragb_showName); 

        view.findViewById(R.id.btn_fragb_showDialog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyDialog dialog=new MyDialog();
                dialog.setCancelable(false);
                assert getFragmentManager() != null;
                dialog.show(getFragmentManager(),null);
            }
        });
    }

    @Override
    public void onClickOk(String data) {
        textView.setText(data);
    }

    @Override
    public void onClickCancel() {
        Toast.makeText(getContext(), "Canceled", Toast.LENGTH_SHORT).show();
    }
}
فایل پیوست

معین سعادتمند

توسط

معین سعادتمند

13 آبان 99

1
حذف شده

سلام مجدد

 

کد رو به صورت فرمت html ارسال کردید و بهم ریخته شده (از فرمت php استفاده کنید )

اما جواب :

۱- نه اینکه پارامتر های onAttach ..Activity بودند واسه خیلی وقت پیش هست (احتمالا این مورد رو در کد های استک اورفلو دیدید) پس دیپریکیت نشده چون این متد چرخه حیات فرگمنت هست و ضمن اینکه activity فرزند context هست .

۲- هنگامی که مینویسید dialog.show( ) نباید از getFragmentManager استفاده کنید چرا که شما میخواهید دیالوگ(نوعی فرگمنت) را در فرگمنت دیگری نشان دهید پس از getChildFragmentManager() استفاده کنید 

متد getFragmentManager() مخصوص زمانیست که دیالوگ یا باتم شیت یا هر نوع فرگمنتی را بخواهید در اکتویتی نمایش دهید 

۳- این قسمت از کدتان اشکال داشت (البته شاید به علت بهم ریختگی باشد )

assert getFragmentManager() != ؟؟؟

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

اگر در هر صورت باز مشکل شما حل نشد پروژه رو این قسمت رو پیوست کنید تا سریع با دیباگینگ مشکل شما رو حل کنم.

موفق باشید

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

13 آبان 99

حذف شده
سلام به اقا پوریای همیشه فعال امتحان کردم اینی که گفتید هم نشد. چجوری باید پروژرو بفرستم نمیشه میگه فایل انتخاب کن ولی پروژه فولدره. دیباگ کردم میدونم ایراد چیه حل کردنشو نمی دونم چجوریه ایراد نال بودن کانتکست زمانی که داره کست میشه به اینترفیس دیالوگ هستش که باعث کرش میشه وقتی از اکتیویتی کال میشه کانتکست نال نیست از فرگمنت کال میشه این مشکل پیش میاد. در مورد دیپریکیت شدن onAttach هم شما وقتی بخواید اوور رایدش کنید میبینید که دوتا onAttach وجود داره که اونی که اکتیویتی برمیگردونه دیپریکیت شده.
معین سعادتمند

15 آبان 99

حذف شده
معین جان فایل رو zip یا rar کن و ارسال کن یا اگر به مشکلی خوردی از سایت های مثل پیکو فایل یا هر سایت دیگه پروژه رو اپلود کن و لینکشو قرار بده من سریع جواب شما رو ارسال میکنم .درمورد دیپریکیت شدن onAttach اونی که ارگومان Activity دریافت میکنه دیپریکیت شده و اونی که ارگومان Context دریافت میکنه دیپریکیت نشده .
پوریا شفیعی

15 آبان 99