web-dev-qa-db-fra.com

Erreur: ce fragment doit fournir un constructeur par défaut (un constructeur public sans argument)

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)
14
Oreo

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.

22
Deividi Cavarzan

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. 

4
inmyth
      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é.

1
Jivraj S Shekhawat

Ajouter @SuppressLint ("ValidFragment")

avant votre classe, 

classe publique DatePickerFragment.

J'espère que ça t'aide

1
Nirmal Sinh Revar