在android studio中构建APK时出错

时间:2014-12-22 10:46:03

标签: android android-studio android-gradle

在我的项目DialogFragment

public class MyDatePicer extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private TextView tv;

    public MyDatePicer(TextView tv) {
        this.tv = tv;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

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

        Dialog picker = new DatePickerDialog(getActivity(), this, year, month, day);
        picker.setTitle("Выбереите дату");
        return picker;
    }

    @Override
    public void onStart() {
        super.onStart();
        Button nButton = ((AlertDialog) getDialog())
                .getButton(DialogInterface.BUTTON_POSITIVE);
        nButton.setText("Готово");
    }

    @Override
    public void onDateSet(android.widget.DatePicker datePicker, int year,int month, int day) {
        tv.setText(day + "-" + (month + 1) + "-" + year);
    }
}

在我的文章中我称之为:

 dateBegin = (TextView) v.findViewById(R.id.dateBegin);
        dateEnd = (TextView) v.findViewById(R.id.dateEnd);

....
 case R.id.dateBegin:
                dateDialog = new MyDatePicer(dateBegin);
                dateDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
                break;
            case R.id.dateEnd:
                dateDialog = new MyDatePicer(dateEnd);
                dateDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
                break;

一切都按照我的需要运作。我在模拟器和手机上运行它可以工作。但是当我尝试构建一个Android APK工作室时会产生错误:

Error:Error: This fragment should provide a default constructor (a public constructor with no arguments) (com.managment.pavel.managmentgradle.fragments.MyDatePicer) [ValidFragment]

我不知道如何在另一个类中传达View(TextView我的日期)。我不知道如何构建APK以便我拥有。告诉我我该怎么办?

3 个答案:

答案 0 :(得分:2)

您的错误消息表明它需要一个空构造函数。试试这个:

public class MyDatePicer extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private TextView tv;

    public MyDatePicer(){
        // empty to satisfy the compiler.
    }

    public MyDatePicer(TextView tv) {
        this.tv = tv;
    }

// truncated...
}

希望这会让你继续:)

答案 1 :(得分:0)

你已经有了一个应该解决问题的答案,我会在这个方法上加上几句谨慎的话。

目前,添加空构造函数应解决您的问题。但是,这取决于NullPointerException onDataSet() tv.setTex(..) - textview可能为null,如果在某个时间点操作系统将尝试使用该默认构造函数重新创建片段。

要解决此问题,您可以在设置文本之前检查null,例如:

if(tv!=null) {
      tv.setText(...)
} 

然而,更好的方法是不将TextView作为构造函数参数传递,而是在对话框中有一个侦听器,它将结果(格式化日期)传递给您的调用活动。 像这样:

@Override
public void onDateSet(android.widget.DatePicker datePicker, int year,int month, int day) {
    listener.onDateSelected(day + "-" + (month + 1) + "-" + year);
}

以下是使用此方法的示例:http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

这也很有用 https://stackoverflow.com/a/12575319/1271435

答案 2 :(得分:0)

我自己也遇到了这个问题。虽然最好根据Android Studio提供的建议重新设计您的应用程序,但是要绕过此错误,您需要做的就是在调试模式而不是发布模式下构建它。这将解决您的问题。

您应该获得选项屏幕,以确定在您输入密钥库密码后立即构建APK时的构建类型。