سلام چیزی که تو اموزش ها گفته شد دیالوگ از 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() != ؟؟؟
این ها مشکلاتی بودند که در کد شما مشاهده کردم
اگر در هر صورت باز مشکل شما حل نشد پروژه رو این قسمت رو پیوست کنید تا سریع با دیباگینگ مشکل شما رو حل کنم.
موفق باشید