【问题标题】:Fragment with DatePickerDialog Fragment带有 DatePickerDialog 片段的片段
【发布时间】:2021-12-08 08:34:20
【问题描述】:

我有一个片段,我必须在其中选择一个日期。为此,我创建了片段数据(DatePicker 对话框)。我想知道为什么不推荐使用以下方法: 在 FragmentAddPaziente:onActivityResult 和 setTargetFragment; 在 FragmentData 中:getTargetFragment 和 onActivityResult。

片段AggiungiPaziente

EditText nomePaz, cognomePaz, dataPaz, mailPaz, telefonoPaz;
String selectedDate;
Button aggiungiPaz;
DBHelper dbPaz;
public static final int REQUEST_CODE = 1; // Codice per identificare il risultato

View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_aggiungi_paziente, container, false);

    nomePaz = view.findViewById(R.id.nomePazNew);
    cognomePaz = view.findViewById(R.id.cognomePazNew);

    final FragmentManager fm = ((AppCompatActivity)getActivity()).getSupportFragmentManager();
    dataPaz = view.findViewById(R.id.dataPazNew);

    dataPaz.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Istanzio un oggetto di tipo FragmentData
            FragmentData newFragment = new FragmentData();
            //Setto questo nuovo fragment in modo da poter ricevere il risultato, specificando il codice REQUEST_CODE
            //setTargetFragment stabilisce la relazione tre due fragment: permette al fragment chiamato (in questo
            //caso, il FragmentData), di sapere dove inviare il risultato
            newFragment.setTargetFragment(FragmentAggiungiPaziente.this, REQUEST_CODE);
            newFragment.show(fm, "datePicker");
        }

    });

    mailPaz = view.findViewById(R.id.mailPazNew);
    telefonoPaz = view.findViewById(R.id.telefonoPazNew);
    dbPaz = new DBHelper(getActivity());
    //
    aggiungiPaz = view.findViewById(R.id.aggiungiPazBtn);
    aggiungiPaz.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String nome = nomePaz.getText().toString();
            String cognome = cognomePaz.getText().toString();
            String data = dataPaz.getText().toString();
            String mail = mailPaz.getText().toString();
            String telefono = telefonoPaz.getText().toString();
            Sessione sessione = new Sessione(getActivity());
            String mail_medico = sessione.getSessione();

            if (nome.equals("") || cognome.equals("") || data.equals("") || mail.equals("") || telefono.equals("")){
                Toast.makeText(getActivity(), "Inserisci tutti i campi", Toast.LENGTH_SHORT).show();
            } else {
                boolean controlloPaz = dbPaz.controlloPaziente(mail_medico,nome,cognome,data,mail,telefono);
                if (controlloPaz==true){
                    boolean inserisci = dbPaz.inserisciPaziente(mail_medico, nome,cognome, data,mail,telefono);
                    if(inserisci==true){
                        Toast.makeText(getActivity(), "Paziente inserito con successo", Toast.LENGTH_SHORT).show();
                        getFragmentManager().beginTransaction().replace(R.id.frameLayoutMain,new FragmentListaPazienti()).addToBackStack(null).commit();
                    } else {
                        Toast.makeText(getActivity(), "Inserimento fallito", Toast.LENGTH_SHORT).show();
                    }
                } else {
                        Toast.makeText(getActivity(), "Paziente già inserito", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    return view;
}


@Override
//Permette di ricevere il dato dal FragmentData, specificando il codice della richiesta e il codice del risultato
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Controllo sui codici
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        // Prelevo il dato dalla stringa
        selectedDate = data.getStringExtra("selectedDate");
        // Setto il valore dell'editText con il valore appena prelevato
        dataPaz.setText(selectedDate);
    }
}

片段数据

公共类 FragmentData 扩展 DialogFragment 实现 DatePickerDialog.OnDateSetListener { 最终日历 c = Calendar.getInstance();

@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
    // i:anno, i1:mese, i2:giorno
    c.set(Calendar.YEAR, i);
    c.set(Calendar.MONTH, i1);
    c.set(Calendar.DAY_OF_MONTH, i2);
    String selectedDate = new SimpleDateFormat("dd/MM/yyyy", Locale.ITALIAN).format(c.getTime());

    // Invio la data al fragment che ha chiamato questo fragment
    getTargetFragment().onActivityResult(
            getTargetRequestCode(),
            Activity.RESULT_OK,
            new Intent().putExtra("selectedDate", selectedDate)
    );


}

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    int anno = c.get(Calendar.YEAR);
    int mese = c.get(Calendar.MONTH);
    int giorno = c.get(Calendar.DAY_OF_MONTH);

    return new DatePickerDialog(getActivity(), FragmentData.this, anno, mese, giorno);
}

【问题讨论】:

    标签: android android-fragments datepicker dialog


    【解决方案1】:

    在 google Fragment 文档中,getTargetFragment 已弃用。

    此方法已弃用。 不使用目标 Fragment 传递结果,而是使用 setFragmentResult 将结果传递给其他 FragmentResultListener 通过 setFragmentResultListener 注册的 FragmentResultListener 实例。

    所以在 Fragment 你应该这样做:

    childFragmentManager.setFragmentResultListener(
       "KEY",
       this, 
       { _, result -> [... do something here] }
    )
    
    dialog.show(childFragmentManager, TAG)
    

    在 DialogFragment 中

    getParentFragmentManager().setFragmentResult("KEY", bundle);
    

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多