java - 有没有办法让一个单独的类控制 Main Activity 类(Android Studio)上的按钮
问题描述
我有一个类主要活动(代码如下所示),它控制我正在开发的应用程序屏幕上的按钮。我有一个名为 SQL 的单独类,理论上它会获取屏幕中输入的信息并将其传递到数据库中。我将如何使 SQL 类响应在主活动中按下的按钮并通过 SQL 查询将主活动中收集的信息传递给数据库。类 SQL 是否需要扩展 Main Activity 并具有 onclicklistner?
import android.content.Intent;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
public class MainActivity extends AppCompatActivity{
public Button mainScreen;
public Button signIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainScreen = findViewById(R.id.createAccountButtonMain);
mainScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Create_Account.class );
startActivity(intent);
}
});
signIn = findViewById(R.id.signInButton);
signIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, HomeScreen.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
// Comment
}
解决方案
您可以创建一个扩展 SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper) 的类,并使用 MainActivity 中的辅助方法。
我将在下面为您分享一个使用 SQLiteOpenHelper 的简单示例。还有其他库可以使用具有较少 SQL 查询的数据库。你也可以检查它们。(例如房间图书馆。)
MainActivity.java - 请注意,这里我们正在访问 MyDbHelper.class 的方法以从数据库中写入或读取。
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
MyDbHelper.getInstance(this);
EditText nameEditText = findViewById(R.id.editTextName);
EditText surnameEditText = findViewById(R.id.editTextSurname);
Button saveButton = findViewById(R.id.save_button);
Button printButton = findViewById(R.id.button_print_db);
saveButton.setOnClickListener(v -> {
Person person = new Person(
nameEditText.getText().toString(),
surnameEditText.getText().toString());
saveToDb(person);
Toast.makeText(this, "Person saved: " + person, Toast.LENGTH_SHORT).show();
nameEditText.getText().clear();
surnameEditText.getText().clear();
});
printButton.setOnClickListener(v -> {
logPersonList();
});
}
private void saveToDb(Person person) {
MyDbHelper.getInstance(this).savePerson(person);
}
private void logPersonList(){
for(Person person : MyDbHelper.getInstance(this).getPersonList()){
Log.v(LOG_TAG, person.toString());
}
}
}
这是管理我们的数据库的 SQLiteOpenHelper 类。
public class MyDbHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = MyDbHelper.class.getSimpleName();
private static MyDbHelper instance;
private static final String DB_NAME = "my_database.db";
private static final int DB_VERSION = 1;
public static final String TABLE_NAME = "person";
public static final String COLUMN_NAME_ID = "id";
public static final String COLUMN_NAME_NAME = "name";
public static final String COLUMN_NAME_SURNAME = "surname";
public static MyDbHelper getInstance(Context context){
if(instance == null){
instance = new MyDbHelper(context);
}
return instance;
}
private MyDbHelper(@Nullable Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String sql = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_NAME_ID + " INTEGER PRIMARY KEY, " +
COLUMN_NAME_NAME + " TEXT, " +
COLUMN_NAME_SURNAME + " TEXT);";
Log.v(LOG_TAG, "onCreate(): " + sql);
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL(
"DROP TABLE IF EXISTS " + TABLE_NAME + ";");
onCreate(sqLiteDatabase);
}
void savePerson(Person person){
try (SQLiteDatabase db = getWritableDatabase()) {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_NAME, person.getName());
values.put(COLUMN_NAME_SURNAME, person.getSurName());
db.insert(TABLE_NAME, null, values);
} catch (SQLException e) {
e.printStackTrace();
}
}
List<Person> getPersonList(){
List<Person> personList = new ArrayList<>();
try (SQLiteDatabase db = getReadableDatabase()) {
Cursor cursor = getReadableDatabase().query(TABLE_NAME,
null, null, null,
null, null, null);
while (cursor.moveToNext()) {
personList.add(getPersonFromCursor(cursor));
}
cursor.close();
} catch (SQLException e) {
e.printStackTrace();
}
return personList;
}
private Person getPersonFromCursor(Cursor cursor){
int idIndex = cursor.getColumnIndexOrThrow(COLUMN_NAME_ID);
int nameIndex = cursor.getColumnIndexOrThrow(COLUMN_NAME_NAME);
int surNameIndex = cursor.getColumnIndexOrThrow(COLUMN_NAME_SURNAME);
int id = cursor.getInt(idIndex);
String name = cursor.getString(nameIndex);
String surName = cursor.getString(surNameIndex);
return new Person(id, name, surName);
}
}
我创建了一个 POJO 类来帮助传递数据。
public class Person {
private int id;
private String name;
private String surName;
public Person(String name, String surname) {
this.name = name;
this.surName = surname;
}
public Person(int id, String name, String surName) {
this.id = id;
this.name = name;
this.surName = surName;
}
public String getName() {
return name;
}
public String getSurName() {
return surName;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", surName='" + surName + '\'' +
'}';
}
}
推荐阅读
- modal-dialog - 为什么在“id”更改后点击不打开imgs?
- javascript - 如何添加进度条的预加载器和根据页面加载速度增加的百分比?
- python - 如何使用OpenCV python绘制平行于最小面积矩形宽度的线连接相反的轮廓点
- javascript - Javascript 的时间和日期
- oracle-apex - ORA-06502: PL/SQL: 数字或值错误: 表格形式 Oracle Apex 4.2 中的字符串缓冲区太小
- c++ - 虚函数和向量(C++)
- python - UnicodeDecodeError:“charmap”编解码器无法解码位置 121835 中的字节 0x8d:字符映射到
- python - 登录表单:如何检测 2 个条件?
- stripe-payments - 从 Stripe 返回“您不能在 FI 中指定不同的服务协议”
- c++ - Linux 和 Mac 中是否有等效的 AddDllDirectory?