首页 > 解决方案 > 有没有办法让一个单独的类控制 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
}

标签: javaandroidandroid-studio

解决方案


您可以创建一个扩展 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 + '\'' +
                '}';
    }
}

推荐阅读