android - Fragment,DialogFragment问题

标签 android android-fragments android-dialogfragment fragment-backstack

我正在从 FragmentA 调用对话框 fragment 并向fragmentA 返回一些值。现在的问题是,每当我从同一个fragmentA转到另一个fragmentB并返回到它时我的对话框 fragment 值被清除

当我点击顾问医生 TextView 时,会打开一个对话框(图2)。在选择一个项目时(图2),将一个值返回给FragmentA。图 3 是在同一 Activity 中打开的 fragment B。但是当我点击图3和popBackStack上的十字按钮时,我的咨询医生值被清除,如图4所示。

enter image description here

enter image description here

enter image description here

enter image description here

Pic 4 is an ISSUE

DialogFragment

 @Override
  public void onStart() {
    super.onStart();
    getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    getDialog().getWindow().setGravity(Gravity.CENTER);
    getDialog().setCancelable(false);
    getDialog().setCanceledOnTouchOutside(false);
    getDialog().closeOptionsMenu();

  }

  @Override public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
  }

  @Nullable @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
      @Nullable Bundle savedInstanceState) {
    getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

    View rootView = inflater.inflate(R.layout.consultant_doc_dialog, container, false);

    recyclerView = (RecyclerView)rootView.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setHasFixedSize(true);
    adapter = new ConsultantDoctAdapter(getContext(),this);
    adapter.getDocList().addAll(new ArrayList<DoctorList>());
    recyclerView.setAdapter(adapter);
    adapter.getDocList().clear();
    adapter.getDocList().addAll(list);
    adapter.notifyDataSetChanged();


    close = (ImageButton)rootView.findViewById(R.id.bt_close);
    close.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        getDialog().dismiss();
      }
    });
    //cityEditText.setOnQueryTextListener(onQueryTextListener);

    return rootView;
  }

fragment

@Nullable @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
      @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.layout_create_leads, container, false);
    ButterKnife.bind(this, view);
    setRetainInstance(true);

      init();
      setPicker();
      setSpinnerListener();
      btCheckCalendar.setOnClickListener(this);
      etCityId.setOnClickListener(this);
      etConsultingDocId.setOnClickListener(this);
      btSubmit.setOnClickListener(this);
      tvClientReferral.setOnClickListener(this);
      etSalesPerson.setText(sharedPref.getString(AppConstants.PREFERENCE_USER_NAME, ""));
      etZone.setText(sharedPref.getString(AppConstants.USER_ZONE, ""));
      etAreaCode.setText(sharedPref.getString(AppConstants.USER_AREA_CODE, ""));
      setSpinner();
      getConsultantDoctorList();
    return view;
  }

fragment B 回调:

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_main, new MyCalendarFragment())
    .addToBackStack("calendarFragment")
    .commit();

DialogCallack:

ConsultantDocDialogFragment consultantDocDialog = new ConsultantDocDialogFragment();
        consultantDocDialog.setParameter(getContext(), this, doclist);
        consultantDocDialog.show(getActivity().getSupportFragmentManager(),
            ConsultantDocDialogFragment.class.getSimpleName());
        break;

请帮助我,以便我能够保存从对话框 fragment 获取的值的状态。

最佳答案

请查找以下代码,它可能会对您有所帮助-

这是 fragment 代码,您可以在其中从对话框 fragment 获取回调-

HomeFragment.java

public class HomeFragment extends Fragment implements AlertDFragment.Callback {
    private static final int DIALOG_FRAGMENT = 100;
    Button alertdfragbutton;
    private View rootView;

    public HomeFragment() {
    }

    public static HomeFragment newInstance() {
        return new HomeFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        initUI(rootView);
        return rootView;
    }

    private void initUI(View rootView) {
        alertdfragbutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                AlertDFragment alertdFragment = new AlertDFragment();
                alertdFragment.setTargetFragment(HomeFragment.this, DIALOG_FRAGMENT);
                // Show Alert DialogFragment
                alertdFragment.show(getChildFragmentManager(), "Alert Dialog Fragment");
            }
        });
    }

    @Override
    public void accept() {
        Log.e("Home  ", "OK");
    }

    @Override
    public void decline() {

    }

    @Override
    public void cancel() {
        Log.e("Home  ", "CANCEL");
    }
}

这是对话框 fragment ,我们在其中使用方法声明 CallBack -

public class AlertDFragment extends DialogFragment {
    Callback callback;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        callback = (Callback) getTargetFragment();
        return new AlertDialog.Builder(getActivity())
                // Set Dialog Icon
                .setIcon(R.drawable.androidhappy)
                // Set Dialog Title
                .setTitle("Alert DialogFragment")
                // Set Dialog Message
                .setMessage("Alert DialogFragment Tutorial")

                // Positive button
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        callback.accept();
                        // Do something else
                        //getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, getActivity().getIntent());
                    }
                })

                // Negative Button
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        callback.cancel();
                        // Do something else
                        // getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, getActivity().getIntent());
                    }
                }).create();
    }

    public static interface Callback {
        public void accept();

        public void decline();

        public void cancel();
    }
}

关于android - Fragment,DialogFragment问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574905/

相关文章:

java - Runnable 根本不在 fragment 内运行

java - DialogFragment 上的正向和负向按钮位置

android - 使用 DialogFragment 从布局 xml 调用方法。它是如何工作的?

android - 如何在从 fragment 打开的自定义对话框中保留监听器?

android - 将 Box2d 扩展添加到 Android Studio

android - 我是一个新的android编码器。我有错误 “Gradle build finished with 242 error(s) and 2 warning(s)”

android - 如何在不同的 fragment 中设置 ActionBar 项目的可见性

java - 尝试调用虚方法

android - 将 BindView 与 Butterknife 一起使用的反面是什么?

java - DecimalFormat java允许在点后输入0