繁体   English   中英

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

[英]Error: This fragment should provide a default constructor (a public constructor with no arguments)

我的课程像这样扩展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()));
    }

}

这就是我在 Activity 中使用它的方式:

public void showDatePickerDialog(View v) {
        new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker");
    }

并像这样调用:

    <EditText
        android:id="@+id/editDate"
        android:onClick="showDatePickerDialog" />

但我总是得到:

Error: This fragment should provide a default constructor (a public constructor with no arguments)

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

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

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

public DatePickerFragment() {}

创建实例并通过setter方法设置EditText:

DatePickerFragment fragment = new DatePickerFragment();
fragment.setEditText(v); // create this setter
fragment.show();

由于EditText是parcelable,您还可以设置为参数:

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这些错误,如下所示:

lintOptions { 
  abortOnError false 
  checkReleaseBuilds false 
} 

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

您需要删除此构造函数

public DatePickerFragment(EditText editText) {
    editDate = editText;
}

您不应将视图引用传递给Fragment。 如果要在Activity或其他地方更新EditText,请使用侦听器。

      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的接口但是这个方法的一个错误的事情是,当应用程序在后台工作了这么久,它再次调用oncreateview时将返回null。

添加@SuppressLint(“ValidFragment”)

在你上课之前,

公共类DatePickerFragment扩展

我希望它对你有所帮助

看看官方文档:Fragment: https<\/a> : \/\/developer.android.com\/reference\/android\/app\/Fragment<\/a>

Fragment 的所有子类都必须包含一个公共的无参数构造函数。 框架通常会在需要时重新实例化一个片段类,特别是在状态恢复期间,并且需要能够找到这个构造函数来实例化它。 如果无参数构造函数不可用,在状态恢复过程中某些情况下会发生运行时异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM