Ma classe s'étend DialogFragment
comme ceci:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
EditText editDate;
private Calendar dateTime = Calendar.getInstance();
private SimpleDateFormat dateFormatter = new SimpleDateFormat("dd MMMM yyyy");
public DatePickerFragment(EditText editText) {
editDate = editText;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
dateTime.set(year, monthOfYear, dayOfMonth);
editDate.setText(dateFormatter
.format(dateTime.getTime()));
}
}
Et voici comment je l'utilise dans l'activité:
public void showDatePickerDialog(View v) {
new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker");
}
Et en appelant comme ça:
<EditText
Android:id="@+id/editDate"
Android:onClick="showDatePickerDialog" />
Mais je reçois toujours:
Error: This fragment should provide a default constructor (a public constructor with no arguments)
La nouvelle version du SDK Android vous oblige à obtenir un constructeur vide, sans argument. C'est maintenant une bonne pratique de faire ceci . Cela vous permet de sauvegarder l'état de l'instance en paquet et Android recréera votre fragment en appelant le constructeur par défaut.
Dans ce cas, vous avez les solutions suivantes:
Tout d'abord, créez le constructeur par défaut:
public DatePickerFragment() {}
Créez l'instance et définissez la méthode EditText via setter:
DatePickerFragment fragment = new DatePickerFragment();
fragment.setEditText(v); // create this setter
fragment.show();
Comme EditText est parcellaire, vous pouvez également définir comme arguments:
DatePickerFragment fragment = new DatePickerFragment();
Bundle bundle = new Bundle();
bundle.putExtra("EditText", v);
fragment.setArguments(bundle); // setArguments is a method that already exists in fragments.
fragment.show(getSupportFragmentManager(), "DatePicker");
[EDIT] Comme suggéré, essayez d'ignorer ces erreurs en configurant build.gradle
comme ceci:
lintOptions {
abortOnError false
checkReleaseBuilds false
}
Cela n'arrêtera pas la construction de votre application en utilisant un constructeur autre que celui par défaut dans les fragments.
Vous devez supprimer ce constructeur
public DatePickerFragment(EditText editText) {
editDate = editText;
}
Vous ne devez pas transmettre de référence View à Fragment. Si vous souhaitez mettre à jour un EditText dans Activity ou ailleurs, utilisez listener.
public DatePickerFragment() {}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
dateTime.set(year, monthOfYear, dayOfMonth);
// editDate.setText(dateFormatter
// .format(dateTime.getTime()));
Intent intent = new Intent();
intent.setAction("CUSTOM_INTENT_FOR_SETTING_EDITTEXT");
Bundle bundle = new Bundle();
bundle.putString("my_data", dateTime.getTime.toString());
intent.putExtras(bundle);
sendBroadcast(intent);
}
public class SubmitFragment extends Fragment {
View view;
EditText editDate;
String strDate;
Button btnSubmit;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_submit, container, false);
editDate = (EditText) view.findViewById(R.id.editDate);
btnSend = (Button) view.findViewById(R.id.buttonSend);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
strDate = editDate.getText().toString();
Log.v("strDate..... >>>", strDate);
}
});
return view;
}
// Our handler for received Intents. This will be called whenever an Intent
// with an action named "CUSTOM_INTENT_FOR_SETTING_EDITTEXT" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get extra data included in the Intent
String message = intent.getStringExtra("my_data");
Log.d("receiver", "message: " + message);
*****// Use this message to set Edittext here...*****
}
};
@Override
protected void onPause() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(getactivity()).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
@Override
protected void onResume() {
// register the receiver here..
super.onResume(); LocalBroadcastManager.getInstance(getactivity()).registerReceiver(mMessageReceiver,
new IntentFilter("CUSTOM_INTENT_FOR_SETTING_EDITTEXT"));
}
}
J'espère que cela aide. Ce que je fais exactement ici utilise localBroadcast to faire le nécessaire .. une autre manière aurait utilisé une interface vers le settext mais une mauvaise chose à propos de cette approche est que, lorsque l'application est en arrière-plan depuis si longtemps, elle retournera null quand oncreateview sera rappelé.
Ajouter @SuppressLint ("ValidFragment")
avant votre classe,
classe publique DatePickerFragment.
J'espère que ça t'aide