如何将值从活动传递到 Android Studio 中的类?

Posted

技术标签:

【中文标题】如何将值从活动传递到 Android Studio 中的类?【英文标题】:How do you pass values from an activity to a class in Android Studio? 【发布时间】:2021-07-22 21:28:54 【问题描述】:

我正在尝试设置删除按钮以从表中删除客户。客户使用回收站视图显示在卡片视图中,因此每个客户都有自己的删除按钮。客户信息使用文本视图显示。我需要将客户 ID 传递给删除方法,以便在表中搜索要删除的特定 ID。如何成功传递数据?

这是我目前必须尝试并传递我需要的数据

public void onBindViewHolder(@NonNull MyHolder holder, final int position) 

    holder.idText.setText(String.valueOf(id.get(position)));
    holder.nameText.setText(String.valueOf(name.get(position)));
    holder.surnameText.setText(String.valueOf(surname.get(position)));
    holder.add1Text.setText(String.valueOf(add1.get(position)));
    holder.add2Text.setText(String.valueOf(add2.get(position)));
    holder.add3Text.setText(String.valueOf(add3.get(position)));
    holder.postCodeText.setText(String.valueOf(postCode.get(position)));
    holder.phoneNumberText.setText(String.valueOf(phoneNumber.get(position)));
    holder.emailText.setText(String.valueOf(email.get(position)));

    GlobalVars.id = holder.idText.getText().toString();

    holder.delete.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            db.deleteCustomer(GlobalVars.id);
        
    );

这是我的删除方法:

public long deleteCustomer(String id)

    SQLiteDatabase db = this.getWriteableDatabase();
    ContentValues idValue = new ContentValues();
    idValue.put(CUSTOMER_ID, id);

    return db.delete(TABLE_NAME, "where Customer_ID = " + idValue, null);

当我运行应用程序时,它会显示客户和按钮,但是当我单击任何按钮时,我会看到一个空白屏幕。然后它返回到我的登录屏幕。

这些是出现在LogCat 中的错误:

2021-05-01 12:16:26.212 18729-18729/com.example.rowlandsflooringapp E/Zygote: isWhitelistProcess - Process is Whitelisted
2021-05-01 12:16:26.212 18729-18729/com.example.rowlandsflooringapp E/Zygote: accessInfo : 1
2021-05-01 12:16:26.244 18729-18729/com.example.rowlandsflooringapp E/andsflooringap: Unknown bits set in runtime_flags: 0x8000
2021-05-01 12:16:55.186 18729-18729/com.example.rowlandsflooringapp E/androidRuntime: FATAL EXCEPTION: main
    Process: com.example.rowlandsflooringapp, PID: 18729
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:445)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:415)
        at com.example.rowlandsflooringapp.CustomerDB.deleteCustomer(CustomerDB.java:70)
        at com.example.rowlandsflooringapp.CustomerAdapter$1.onClick(CustomerAdapter.java:73)
        at android.view.View.performClick(View.java:7862)
        at android.widget.TextView.performClick(TextView.java:15004)
        at android.view.View.performClickInternal(View.java:7831)
        at android.view.View.access$3600(View.java:879)
        at android.view.View$PerformClick.run(View.java:29359)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

【问题讨论】:

使用主键在CustomerDB 中实现public boolean deleteCustomer(...)。将其发布到代码中并将其更新为真正的minimal reproducible example。然后创建一个DBInteractor 接口,并将其传递给适配器。在DBInteractor::onDeletePressed(int id) 回调中,调用CustomerDB::deleteCustomer(id)。应该是这样的。 对不起,我对这个很陌生,到目前为止,大学讲师还不是很好,我不完全确定我的意思 你能发布你的数据库类吗?您应该能够在那里而不是在您的适配器类中实现删除方法 【参考方案1】:

经过几次尝试但都失败了,我决定再次从头开始创建删除方法。这就是我最终的结果,而且效果很好。

databasehelper中的delete方法:

void deleteOneRow(String row_id)
    SQLiteDatabase db = this.getWritableDatabase();
    long result = db.delete(TABLE_NAME, "_id=?", new String[]row_id);
    if(result == -1)
        Toast.makeText(context, "Failed to Delete.", Toast.LENGTH_SHORT).show();
    else
        Toast.makeText(context, "Successfully Deleted.", Toast.LENGTH_SHORT).show();
    

调用删除方法:

void confirmDialog()
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Delete " + name + " ?");
    builder.setMessage("Are you sure you want to delete " + name + " ?");
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
        @Override
        public void onClick(DialogInterface dialogInterface, int i) 
            MyDatabaseHelper myDB = new MyDatabaseHelper(UpdateActivity.this);
            myDB.deleteOneRow(id);
            finish();
        
    );
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() 
        @Override
        public void onClick(DialogInterface dialogInterface, int i) 

        
    );
    builder.create().show();
    

【讨论】:

以上是关于如何将值从活动传递到 Android Studio 中的类?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从动态列表视图传递到活动?

如何将值从一个活动传递到上一个活动

如何将值从片段/活动传递到 xml?

如何将值从一个活动中的片段传递到另一个活动? [复制]

如何将值从其他活动传递给 viewpager 片段?

如何将值从主屏幕小部件传递给应用程序?