Проблема с работой с preferences в Java-Android разработке

Суть программы:

Таблица, в которую можно вписывать текст и менять цвет разных клеток.

Реализация программы:

Я попытался вшить preferences для сохранения данных после перезапуска программы. Для этого я создал 2 метода: saveTable (для сохранения данных перед выходом) и loadTable (для выгрузки данных при входе). Метод saveTable я заставил запускаться с стандартным методом protected void onResume(), а метод loadTable - стаким же стандартным методом protected void onStop(). Я решил вшить loadTable в onStop потому как согласно таблице из моего учебника (Head First Android), он выполняеться в любом случае (как при запуске, так и при перезапуске или возвращении активности на первый план. Та самая таблица

Суть проблемы:

Программа вылетает при выходе из неё, из-за чего данные не сохраняються. После перезахода программа тоже вылетала, но потом я добавил эти строки кода:

try {
        A1.setText(GetText.get("A1"));
        A2.setText(GetText.get("A2"));
    }
    catch (Exception e){
        A1.setText("-----");
        A2.setText("-----");
    } return;

По понятным причинам, программа также вылетает при смене ориентации.

Вот код из .xml файла:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<RadioGroup
    android:id="@+id/radioGroup"
    android:layout_width="111dp"
    android:layout_height="98dp"
    android:layout_marginStart="36dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <RadioButton
        android:id="@+id/Color_Red"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Red" />

    <RadioButton
        android:id="@+id/Color_Green"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Green" />

    <RadioButton
        android:id="@+id/Color_Blue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Blue" />
</RadioGroup>

<EditText
    android:id="@+id/Name_Enter"
    android:layout_width="574dp"
    android:layout_height="44dp"
    android:ems="10"
    android:hint="Enter name"
    android:inputType="textPersonName"
    android:textAllCaps="false"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.312"
    app:layout_constraintStart_toEndOf="@+id/radioGroup"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/B1"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/B2"
    app:layout_constraintTop_toTopOf="@+id/B2" />

<Button
    android:id="@+id/A1"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/A2"
    app:layout_constraintTop_toTopOf="@+id/A2" />

<Button
    android:id="@+id/C1"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/C2"
    app:layout_constraintTop_toTopOf="@+id/C2" />

<Button
    android:id="@+id/B3"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toEndOf="@+id/A3"
    app:layout_constraintTop_toBottomOf="@+id/A3" />

<Button
    android:id="@+id/C3"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toEndOf="@+id/B3"
    app:layout_constraintTop_toBottomOf="@+id/B3" />

<Button
    android:id="@+id/C2"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/C3"
    app:layout_constraintTop_toBottomOf="@+id/B3" />

<Button
    android:id="@+id/A3"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toEndOf="@+id/Num_3"
    app:layout_constraintTop_toBottomOf="@+id/Num_3" />

<Button
    android:id="@+id/Num_1"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:text="1"
    app:layout_constraintEnd_toStartOf="@+id/Num_2"
    app:layout_constraintTop_toTopOf="@+id/Num_2" />

<Button
    android:id="@+id/B2"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/B3"
    app:layout_constraintTop_toTopOf="@+id/B3" />

<Button
    android:id="@+id/A2"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:onClick="OnClick"
    android:text="-----"
    app:layout_constraintEnd_toStartOf="@+id/A3"
    app:layout_constraintTop_toTopOf="@+id/A3" />

<Button
    android:id="@+id/Num_2"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:text="2"
    app:layout_constraintEnd_toStartOf="@+id/Num_3"
    app:layout_constraintTop_toTopOf="@+id/Num_3" />

<Button
    android:id="@+id/Num_3"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:layout_marginTop="20dp"
    android:layout_marginEnd="164dp"
    android:background="@drawable/button"
    android:text="3"
    app:layout_constraintEnd_toEndOf="@+id/Name_Enter"
    app:layout_constraintTop_toBottomOf="@+id/Name_Enter" />

<Button
    android:id="@+id/Num_C"
    android:layout_width="57dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:text="C"
    app:layout_constraintEnd_toStartOf="@+id/C1"
    app:layout_constraintTop_toBottomOf="@+id/B1" />

<Button
    android:id="@+id/Num_A"
    android:layout_width="57dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:text="A"
    app:layout_constraintEnd_toStartOf="@+id/A1"
    app:layout_constraintTop_toTopOf="@+id/A1" />

<Button
    android:id="@+id/Num_B"
    android:layout_width="57dp"
    android:layout_height="40dp"
    android:background="@drawable/button"
    android:text="B"
    app:layout_constraintEnd_toStartOf="@+id/B1"
    app:layout_constraintTop_toTopOf="@+id/B1" />
</androidx.constraintlayout.widget.ConstraintLayout>

В коде, который я скопировал много чего пока не задействовано в программе. Я думал не копировать вес код, но из-за ConstraintLayout пришлось.

Вот код из .MainActivivty:

package com.hfad.project_n20;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;

import java.util.HashMap;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    EditText Name_Enter;
    Button Num_1;
    Button Num_2;
    Button Num_3;
    Button Num_A;
    Button Num_B;
    Button Num_C;
    Button A1;
    Button A2;
    Button A3;
    Button B1;
    Button B2;
    Button B3;
    Button C1;
    Button C2;
    Button C3;
    RadioButton Color_Red;
    RadioButton Color_Blue;
    RadioButton Color_Green;

    final String SAVED_TEXT = "saved_text";
    final String SAVED_COLOR = "saved_color";
    final String RED = "RED";
    final String BLUE = "BLUE";
    final String GREEN = "GREEN";
    final String NOTHING = "NOTHING";
    SharedPreferences sPrefColorSave;
    SharedPreferences sPrefTextSave;
    SharedPreferences sPrefColorLoad;
    SharedPreferences sPrefTextLoad;


    HashMap<String, String> PutText = new HashMap<>(); //Для загрузки текста в preferences 
    HashMap<String, String> PutColor = new HashMap<>();//Для загрузки цветов в preferences 
    HashMap<String, String> GetText = new HashMap<>(); //Для выгрузки текста из preferences
    HashMap<String, String> GetColor = new HashMap<>(); //Для выгрузки цветов из preferences

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Name_Enter = (EditText)findViewById(R.id.Name_Enter);

        Num_1 = (Button)findViewById(R.id.Num_1);
        Num_2 = (Button)findViewById(R.id.Num_2);
        Num_3 = (Button)findViewById(R.id.Num_3);
        Num_A = (Button)findViewById(R.id.Num_A);
        Num_B = (Button)findViewById(R.id.Num_B);
        Num_C = (Button)findViewById(R.id.Num_C);

        A1 = (Button)findViewById(R.id.A1);
        A2 = (Button)findViewById(R.id.A2);
        A3 = (Button)findViewById(R.id.A3);
        B1 = (Button)findViewById(R.id.B1);
        B2 = (Button)findViewById(R.id.B2);
        B3 = (Button)findViewById(R.id.B3);
        C1 = (Button)findViewById(R.id.C1);
        C2 = (Button)findViewById(R.id.C2);
        C3 = (Button)findViewById(R.id.C3);

        Color_Red = (RadioButton)findViewById(R.id.Color_Red);
        Color_Blue = (RadioButton)findViewById(R.id.Color_Blue);
        Color_Green = (RadioButton)findViewById(R.id.Color_Green);
    }

    @Override
    protected void onResume() {
        super.onResume();
        loadTable();
    }

    @Override
    protected void onStop() {
        super.onStop();
        saveTable();
    }

    public void OnClick(View view){
        switch (view.getId()){
            case R.id.A1:
                if(Color_Red.isChecked()){
                    A1.setBackgroundColor(Color.RED);
                    A1.setText(Name_Enter.getText());
                    PutText.put("A1", String.valueOf(Name_Enter.getText())); //Загрузка цвета и текста в хеш-мапы чтобы потом всунуть в preferences
                    PutColor.put("A1", RED);

                }
                else if(Color_Blue.isChecked()){
                    A1.setBackgroundColor(Color.BLUE);
                    A1.setText(Name_Enter.getText());
                    PutText.put("A1", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A1", BLUE);
                }
                else if(Color_Green.isChecked()){
                    A1.setBackgroundColor(Color.GREEN);
                    A1.setText(Name_Enter.getText());
                    PutText.put("A1", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A1", GREEN);
                }
                else{
                    A1.setText(Name_Enter.getText());
                    PutText.put("A1", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A1", NOTHING);
                }

                break;

            case R.id.A2:
                if(Color_Red.isChecked()){
                    A2.setBackgroundColor(Color.RED);
                    A2.setText(Name_Enter.getText());
                    PutText.put("A2", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A2", RED);
                }
                else if(Color_Blue.isChecked()){
                    A2.setBackgroundColor(Color.BLUE);
                    A2.setText(Name_Enter.getText());
                    PutText.put("A2", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A2", BLUE);
                }
                else if(Color_Green.isChecked()){
                    A2.setBackgroundColor(Color.GREEN);
                    A2.setText(Name_Enter.getText());
                    PutText.put("A2", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A2", GREEN);
                }
                else{
                    A2.setText(Name_Enter.getText());
                    PutText.put("A2", String.valueOf(Name_Enter.getText()));
                    PutColor.put("A2", NOTHING);
                }

                break;

        }
    }

    void saveTable() {
        sPrefTextSave = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor edTextSave = sPrefTextSave.edit();
        edTextSave.putStringSet(SAVED_TEXT, (Set<String>) PutText);
        edTextSave.commit();

        sPrefColorSave = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor edColorSave = sPrefColorSave.edit();
        edColorSave.putStringSet(SAVED_COLOR, (Set<String>) PutColor);
        edColorSave.commit();
    }

    void loadTable(){
        sPrefColorLoad = getPreferences(MODE_PRIVATE);
        GetColor = (HashMap<String, String>) sPrefColorLoad.getStringSet(SAVED_COLOR, null);
        sPrefTextLoad = getPreferences(MODE_PRIVATE);
        GetText = (HashMap<String, String>) sPrefTextLoad.getStringSet(SAVED_TEXT, null);

        try {
            A1.setText(GetText.get("A1"));
            A2.setText(GetText.get("A2"));
        }
        catch (Exception e){
            A1.setText("-----");
            A2.setText("-----");
        } return; //Если данных в preferences нету - они заменяються палочками
    }

}

P.S: много чего пока не задействовано и не реализовано(например выгрузка цветов, хотя они и сохраняються

Надеюсь на вашу помощь.


Ответы (0 шт):