Проблема с работой с 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: много чего пока не задействовано и не реализовано(например выгрузка цветов, хотя они и сохраняються
Надеюсь на вашу помощь.