кликабельная кнопка на фрагменте ... "не имеет конструктора с нулевым аргументом"? Перепробовал все что видел на stackoverflow - PullRequest
0 голосов
/ 21 апреля 2020
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;

}

Не могу найти способ исправить это. Он находится на студии android, и я пытаюсь добавить активируемую кнопку к фрагменту, и она вылетает каждый раз при нажатии кнопки. Любая помощь очень ценится!

    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)

Это операция по созданию дивайла, после поиска я, кажется, не думаю, что в ней что-то не хватает. Но есть много код, и у меня нет острых глаз на ошибки, подобные этой

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

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Если вы хотите подключить 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 и использовать метод синглтона

public void onClick(View v) {
     divelogcreate dbHelper = divelogcreate.getInstance(getActivity());
     dbHelper.deleteData("your_id")
}
0 голосов
/ 21 апреля 2020

Вы не можете использовать startActivity на классах без расширенного Activity. Если вы хотите создать divelogcreate, вам просто нужно использовать конструктор по умолчанию, например:

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

И вам нужно выучить правильное именование в Java. Назовите ваши классы с помощью CamelCase (например):

public class DiveLogCreateDBHelper extends SQLiteOpenHelper

И я рекомендую вам изучить "База данных комнат" в Android Компонент архитектуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...