片段,DialogFragment 问题

Fragment,DialogFragment Issue

我正在从 FragmentA 调用对话片段,并且 return 将一些值传递给 fragmentA。现在的问题是每当我从同一个 fragmentA 转到另一个 fragmentB 并且 return 到它 我的对话片段值被清除

当我单击 consultant doctor textview 时,会打开一个对话框(图 2)。在选择一个项目(图 2)时,return 返回一个值给 FragmentA。图 3 是在 activity 上打开的片段 B。但是当我点击图 3 和 popBackStack 上的十字按钮时,我的咨询医生价值清除如图 4 所示。

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

片段

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

片段 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 Transition" 弹出自定义视图呢? 只需创建

的全局引用
Dialogue dialogue
View popupView

然后单击任何文本视图按钮等。 你可以调用像

这样的方法
void popup(){
    popupView = LayoutInflater.from(getActivity()).inflate(R.layout.your_calenderlayout, null);
    //suppose you have TextView cal_textview in popUp view i.e, your_calenderlayout
    cal_textview    = (TextView ) popupView.findViewById(R.id.cal_textview);
    dialog          = new Dialog(getContext());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCanceledOnTouchOutside(true);
    dialog.setContentView(popupView); //and just add your popUpview
    // For setting backgroung
    /*dialog.getWindow().setBackgroundDrawableResource(android.R.color.Transparent);
      */ 
    //For setting the width or height of popup     
    /*WindowManager.LayoutParams lp = new WindowManager.LayoutParams();

    lp.copyFrom(dialog.getWindow().getAttributes());

    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;

    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

    lp.gravity = Gravity.CENTER;
    dialog.getWindow().setAttributes(lp);*/
    dialog.show();
    }

并且在关闭 popUp 或单击 popupView 内的视图时,您可以直接在片段内设置变量或成员的值

希望这会有所帮助

从 DialogFragment 获取 return 值的一种简单方法是使用 setTargetFragment 调用 fragmentB 创建,然后 return 数据到 getTargetFragment(如果不为空)。在fragmentA中可以通过onActivityResult.

接收数据

另一种方法是使用 SharedPreferences。您可以使用 onResumeonHiddenChanged.

获得新值

您可以使用 Shared prefs 或 sqlite 来获取您的值,如果您认为它在共享 prefs 或 sqlite 中保存临时数据的用处较少,那么 Singleton 模型是一个不错的选择..我相信我们应该遵循 KISS 设计原则:P

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

这是 Fragment 代码,您可以在其中从 Dialog Fragment 获取 CallBack-

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

这是 Dialog 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();
    }
}