Java 错误:此片段应提供默认构造函数(没有参数的公共构造函数)

Java 错误:此片段应提供默认构造函数(没有参数的公共构造函数),java,android,android-studio,Java,Android,Android Studio,我的类扩展了DialogFragment,如下所示: public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { EditText editDate; private Calendar dateTime = Calendar.getInstance(); private SimpleDateFormat dateFormatt

我的类扩展了DialogFragment,如下所示:

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

}
    <EditText
        android:id="@+id/editDate"
        android:onClick="showDatePickerDialog" />
lintOptions { 
  abortOnError false 
  checkReleaseBuilds false 
} 
这就是我在活动中使用它的方式:

public void showDatePickerDialog(View v) {
        new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker");
    }
像这样打电话:

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

}
    <EditText
        android:id="@+id/editDate"
        android:onClick="showDatePickerDialog" />
lintOptions { 
  abortOnError false 
  checkReleaseBuilds false 
} 

新版本的Android SDK强制您获得一个空的、无参数的构造函数。现在这样做是一种很好的做法。 这允许您将实例状态保存到bundle中,Android将调用默认构造函数重新创建您的片段

在这种情况下,您有以下解决方案:

首先,创建默认构造函数:

public DatePickerFragment() {}
创建实例并通过setter方法设置EditText:

DatePickerFragment fragment = new DatePickerFragment();
fragment.setEditText(v); // create this setter
fragment.show();
由于EditText是可打包的,因此还可以设置为参数:

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");
[编辑] 正如建议的那样,尝试忽略以下错误,如下配置
build.gradle

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

}
    <EditText
        android:id="@+id/editDate"
        android:onClick="showDatePickerDialog" />
lintOptions { 
  abortOnError false 
  checkReleaseBuilds false 
} 

这不会通过在片段中使用非默认构造函数来停止应用程序的生成。

您需要删除此构造函数

public DatePickerFragment(EditText editText) {
    editDate = editText;
}
您不应该将视图引用传递给片段。如果要在“活动”或其他位置更新EditText,请使用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"));
        }
}
希望这有帮助。我在这里做的就是使用localBroadcast 另一种方法是使用settext的接口 但这种方法的一个错误之处是,当应用程序在后台运行时 long,再次调用oncreateview时将返回null。

Add@SuppressLint(“ValidFragment”)

上课前

公共类DatePickerFragment扩展


我希望它能帮助您

Android Fragment应该始终有一个默认的无参数构造函数。如果您真的想忽略它,可以在IDE上禁用lint警告。如果你能提到你为什么要传递EditText,可以有多种方法来满足你的需求@Milanix您可以做的是在调用活动/片段上实现回调侦听器,如接口OnDateSetListener{on dateSet(Date Date);}。然后可以使用setTargetFragment()在调用方上设置它,并在对话框片段getTargetFragment中检索它。然后,当您完成日期选择后,回击该侦听器。也添加此构造函数,因为您已经将Setter用于edittext。public DatePickerFragment(){editDate=null;}@eer您能告诉我怎么办吗,我已经尝试了很多方法来解决这个小问题,但还没有解决我必须在哪里进行更改?在
DatePickerFragment
中创建默认构造函数。如果您选择通过setter或arguments设置EditText,这是您的选择请检查您建议的我的更新代码,我发布了above@Oreo当然,我忘记了这个方法需要fragmentManager和一个标记,upated nowok,但仍然无法解析这一行的方法setText(java.lang.String):editText.setText(dateFormatter.format(dateTime.getTime());请检查DatePickerFragment类非常清楚,但让我困惑的是,我仍然在主活动中使用showDatePickerDialog(View v){…},但当用户点击我的片段之一的xml中的EditText时调用此方法。所以不要在活动和片段中放置位置和放置内容(我有EditText的地方)这就是为什么我发布了代码,包括类、主活动和片段,检查并更新您的代码…不在片段中,我也放置了片段代码现在它更清楚了,请检查我现在使用的示例:,您可以在您的末尾尝试,只需在其中一个片段中使用EditText,并尝试使用DatePicker显示日期…我正在尝试我的最佳选择是你更新了你的代码。如果是,你可以在那里看到日志。添加更多日志以检查精确行为。尝试在那里添加toast消息。在OnReceive中,消息作为参数。你能告诉我为什么我们不应该在片段或活动的构造函数中传递视图吗?它只是视图吗?我认为这是一个不错的Java编码但这是一个糟糕的Android实践?首先,你不应该自定义片段构造函数,句号。[。你应该只将数据传递给片段,而不是视图。为什么?因为生命周期的原因。当运行一个长进程(如rest api)时更新视图时,视图可能已经消失,因为保存它的活动或片段已被销毁。这将为您提供空指针Exc。因此,视图交互应使用空检查与侦听器进行。但现在更好的方法是使用事件总线/Otto库。