دوره زبان تخصصی برای برنامه‌نویسان (هدیه ویژه ثبت‌نام در دوره‌های متخصص) (فرصت محدود ⏰)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ معین سعادتمند
مشکل null بودن context زمان call کردن dialog از fragment
جامعه جاوا (اندروید) ایجاد شده در ۱۲ آبان ۱۳۹۹

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

سلام و احترام 

 

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

پوریا شفیعی ۱۲ آبان ۱۳۹۹، ۲۰:۳۰
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();
    }
}
معین سعادتمند ۱۳ آبان ۱۳۹۹، ۱۴:۲۶
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();
    }
}
معین سعادتمند ۱۳ آبان ۱۳۹۹، ۱۴:۳۱

سلام مجدد

 

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

اما جواب :

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

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

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

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

assert getFragmentManager() != ؟؟؟

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

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

موفق باشید

 

پوریا شفیعی ۱۳ آبان ۱۳۹۹، ۱۶:۰۶