片段上的可点击按钮..."has no zero argument constructor" ?尝试了我在堆栈溢出上看到的所有内容


public class DashboardFragment extends Fragment {
private DashboardViewModel dashboardViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
dashboardViewModel =
ViewModelProviders.of(this).get(DashboardViewModel.class);
View v = inflater.inflate(R.layout.fragment_dashboard, container, false);
Button button = (Button) v.findViewById(R.id.createLogBTN);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), divelogcreate.class);
startActivity(intent);
}
});
return v;
}

似乎找不到任何方法来解决这个问题。它在安卓工作室上,我试图在片段中添加一个可点击的按钮,每次点击按钮都会崩溃。非常感谢您的帮助

Error Exception:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.divelogapp, PID: 10513
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.divelogapp/com.example.divelogapp.divelogcreate}: java.lang.InstantiationException: java.lang.Class<com.example.divelogapp.divelogcreate> has no zero argument constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.divelogapp.divelogcreate> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41)
at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)

这是divelogcreate活动,经过搜索,我似乎不认为它遗漏了什么。l但有很多代码,我对这样的错误没有敏锐的洞察力

package com.example.divelogapp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class divelogcreate extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "divelogStartOver2.db";
public static final String TABLE_NAME = "divelog_table";
public static final String COL_1 = "ID";
public static final String COL_2 = "DIVE_NUM";
public static final String COL_3 = "DATE";
public static final String COL_4 = "LOCATION";
public static final String COL_5 = "SITE";
public static final String COL_6 = "TEMPERATURE";
public static final String COL_7 = "VISIBILITY";
public static final String COL_8 = "MAX_DEPTH";
public static final String COL_9 = "BOTTOM_TIME";
public static final String COL_10 = "SAFTEY_CONDUCT_TIME";
public static final String COL_11= "TOTAL_TIME";
public static final String COL_12= "WEIGHT";
public static final String COL_13 = "SUIT_TYPE";
public static final String COL_14 = "THICKNESS";
public static final String COL_15 = "AIR_TYPE";
public static final String COL_16 = "COMMENTS";
public static final String COL_17 = "SIG_FIRSTNAME";
public static final String COL_18 = "SIG_LASTNAME";
public static final String COL_19 = "DATE_SIGNED";
public static final String COL_20 = "SIGN_DIVE_NUM";
public static final String COL_21 = "COMPANY";
public divelogcreate(Context context) {
super(context, DATABASE_NAME, null, 1);
}
public divelogcreate(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"DIVE_NUM TEXT, DATE TEXT, LOCATION TEXT, SITE TEXT, TEMPERATURE INTEGER, VISIBILITY TEXT," +
"MAX_DEPTH INTEGER, BOTTOM_TIME INTEGER, SAFTEY_CONDUCT_TIME INTEGER, TOTAL_TIME INTEGER," +
"WEIGHT INTEGER, SUIT_TYPE TEXT, THICKNESS INTEGER, AIR_TYPE TEXT, COMMENTS TEXT," +
"SIG_FIRSTNAME TEXT, SIG_LASTNAME TEXT, DATE_SIGNED TEXT, SIGN_DIVE_NUM TEXT, COMPANY TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
public boolean insertData(String dive_num, String date, String location, String site, String temperature,
String visibility, String max_depth, String bottom_time, String saftey,
String total_time, String weight, String suit_type, String thickness,
String air_type, String comments, String sign_first, String sign_last,
String date_sign, String sign_dive_num, String company){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,dive_num);
contentValues.put(COL_3,date);
contentValues.put(COL_4,location);
contentValues.put(COL_5,site);
contentValues.put(COL_6,temperature);
contentValues.put(COL_7,visibility);
contentValues.put(COL_8,max_depth);
contentValues.put(COL_9,bottom_time);
contentValues.put(COL_10,saftey);
contentValues.put(COL_11,total_time);
contentValues.put(COL_12,weight);
contentValues.put(COL_13,suit_type);
contentValues.put(COL_14,thickness);
contentValues.put(COL_15,air_type);
contentValues.put(COL_16,comments);
contentValues.put(COL_17,sign_first);
contentValues.put(COL_18,sign_last);
contentValues.put(COL_19,date_sign);
contentValues.put(COL_20,sign_dive_num);
contentValues.put(COL_21,company);
long results = db.insert(TABLE_NAME,null,contentValues);
if (results == -1)
return false;
else
return true;
}
public Cursor getAllData(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
return res;
}
public boolean updateData(String id, String dive_num, String date, String location, String site, String temperature,
String visibility, String max_depth, String bottom_time, String saftey,
String total_time, String weight, String suit_type, String thickness,
String air_type, String comments, String sign_first, String sign_last,
String date_sign, String sign_dive_num, String company){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_1,id);
contentValues.put(COL_2,dive_num);
contentValues.put(COL_3,date);
contentValues.put(COL_4,location);
contentValues.put(COL_5,site);
contentValues.put(COL_6,temperature);
contentValues.put(COL_7,visibility);
contentValues.put(COL_8,max_depth);
contentValues.put(COL_9,bottom_time);
contentValues.put(COL_10,saftey);
contentValues.put(COL_11,total_time);
contentValues.put(COL_12,weight);
contentValues.put(COL_13,suit_type);
contentValues.put(COL_14,thickness);
contentValues.put(COL_15,air_type);
contentValues.put(COL_16,comments);
contentValues.put(COL_17,sign_first);
contentValues.put(COL_18,sign_last);
contentValues.put(COL_19,date_sign);
contentValues.put(COL_20,sign_dive_num);
contentValues.put(COL_21,company);
db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id});
return true;
}
public Integer deleteData (String id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ?", new String[] {id});
}
}

如果没有"活动扩展",则不能在类上使用startActivity。如果你想创建divelogcreate,你只需要使用一个默认的构造函数,比如:

final divelogcreate dLogCreate = new divelogcreate(getContext())
// end get your db
final SQLiteDatabase mydb = db.getWritableDatabase();

您需要学习Java中的正确命名。用CamelCase命名你的类(例如(:

public class DiveLogCreateDBHelper extends SQLiteOpenHelper

我建议你在安卓架构组件中学习"房间数据库">

如果您想连接sqllitedb,最好的解决方案是使您的数据库实例在整个应用程序的生命周期中成为一个单一实例

private static divelogcreate instance;
public static synchronized divelogcreate getInstance(Context context) {
if (instance == null) {
instance = new divelogcreate(context.getApplicationContext());
}
return instance;
}
public divelogcreate(Context context) {
super(context, DATABASE_NAME, null, 1);
}

每当您想将上下文传递给db并使用singleton方法时

public void onClick(View v) {
divelogcreate dbHelper = divelogcreate.getInstance(getActivity());
dbHelper.deleteData("your_id")
}

最新更新