片段,对话框片段问题

问题描述:

我从FragmentA调用对话框片段并将一些值返回给fragmentA。现在的问题是,每当我去从相同的fragmentA的另一个fragmentB并返回它我的对话框片段值得到清除片段,对话框片段问题

当我点击咨询医生的textview,一个对话框打开(图2)。在选择一个项目(图2)后,返回一个值到FragmentA。图片3是一个片段B,它在相同的活动中打开。但是,当我在十字按钮单击图三和popBackStack,我的咨询医师值表示PIC的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; 
    } 

片段

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

请帮助我,让我可以能保存状态的值从对话片段了。

请找到下面的代码,它可以帮助你 -

这是片段的代码,你可以从对话片段 -

HomeFragment.java

得到回调0
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"); 
    } 
} 

下面是对话的片段,我们有方法 -

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

而不是使用“片段转型”你为什么不只是弹出自定义视图 刚刚创建的

Dialogue dialogue 
View popupView 

一个全球性的基准,并在任何TextView中点击按钮等 可以只是调用一个方法类似

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

和解雇弹出窗口或内部popupView视图点击你设置的变量或成员的值的片段内直接

希望这将有助于

+0

声明回调不,我想用R.Layout.calendar_layout作为B片段 –

一个简单的方法从DialogFragment返回值是使用setTargetFragment用于调用fragmentB创作,然后将数据返回到getTargetFragment(如果不为null)。在fragmentA中,您可以通过onActivityResult接收数据。

另一种方法是使用SharedPreferences。您可以通过onResumeonHiddenChanged获得新值。

+0

SharedPrefences ....我收到来自对话框有点8个字段值,一些来自datepicker/timepicker,并且所有人在返回时都清除。因此,你仍然建议使用Shared Pref并在那里保存这么多值。 –

+1

@ young_08好吧,如果你认为它是真的,那么它使用共享首选项8个值不是一个大问题,那么你可以使用SQLite或遵循其他建议的解决方案CoolMind –

+0

@AdeelTurk所以我尝试过其他解决方案CoolMind这是setTargetFragment。面对同样的问题,当我从片段B回到片段A时,我在医生顾问领域设置的getTargetFragment值就清除了。这只会发生在对话框和日期选择器上。其他领域保留价值。 ): –

,可以使用共享的首选项或sqlite的让你的价值观,如果你认为它使用较少保存在共享的首选项或sqlite的临时数据然后辛格尔顿模式是一个不错的选择。我认为,我们应该遵循KISS 设计原则:P