Как сохранить значения переменных для действий в Android Studio - PullRequest
1 голос
/ 14 июля 2020

Я здесь новичок и еще не знаком с программированием. В настоящее время я работаю над проектом и застрял около недели. Единственное, что я хочу сделать, это сохранить две переменные, чтобы их можно было увидеть после закрытия и повторного открытия приложения. Кроме того, по какой-то причине, когда я открываю действие настроек, значения моих переменных сбрасываются на ноль.

Я знаю, что другие публиковали похожие вопросы, но я просто не могу адаптировать его к своей работе. Я не понимаю многих вещей, которые я читаю, например SharedPreferences, onPause () и GAME_STATE_KEY. Может ли кто-нибудь объяснить, как это сделать, не ссылаясь на статьи документации Android? Я даже не понимаю, что говорится в документации, и код копирования / вставки там, похоже, не работает.

Это моя MainActivity

package com.example.courtcounter;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity<format> extends AppCompatActivity {


    TextView textView;

     int scoreTeamA = 0;
     int scoreTeamB = 0;


    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy\n hh:mm aa");
    String format = simpleDateFormat.format(new Date());


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.team_a_score);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                String shareMessage = createMessage(format, scoreTeamA, scoreTeamB);

                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.putExtra(Intent.EXTRA_SUBJECT, "Match Score");
                intent.setType("text/*");
                intent.putExtra(Intent.EXTRA_TEXT, shareMessage);
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivity(intent);
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.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();

        if (id == R.id.action_settings){

            Intent intent = new Intent(this, SettingsActivity.class);
            startActivity(intent);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private String createMessage(String date, int TeamA, int TeamB){

        EditText editTeamA = findViewById(R.id.team_a_name);
        String teamAName =editTeamA.getText().toString();

        EditText editTeamB = findViewById(R.id.team_b_name);
        String teamBName = editTeamB.getText().toString();


        String shareMessage =format +"\n"+ teamAName+ " : "+ TeamA + "\n" + teamBName + " : "+ TeamB;
        return shareMessage;
    }


    /** Resets score of boths teams to 0
     */
    public void resetScore(View v){
        scoreTeamA = 0;
        scoreTeamB = 0;
        displayForTeamA(scoreTeamA);
        displayForTeamB(scoreTeamB);
    }

    /**
     * Displays the given score for Team A.
     */
    public void displayForTeamA(int scoreTeamA){
        TextView scoreViewA = (TextView)findViewById(R.id.team_a_score);
        String teamA = scoreViewA.getText().toString();
        scoreViewA.setText(String.valueOf(scoreTeamA));

    }

    /**
     * Displays the given score for Team B.
     */
    public void displayForTeamB(int score) {
        TextView scoreViewB = (TextView) findViewById(R.id.team_b_score);
        String teamB = scoreViewB.getText().toString();
        scoreViewB.setText(String.valueOf(score));
    }

    /**
     * This method is called when the +3 points button is clicked.
     */
    public void ThreeA(View view){
        scoreTeamA = scoreTeamA +3;
        displayForTeamA(scoreTeamA);
    }

    /**
     * This method is called when the +2 points button is clicked.
     */
    public void TwoA(View view){
        scoreTeamA = scoreTeamA +2;
        displayForTeamA(scoreTeamA);
    }

    /**
     * This method is called when the FREE THROW button is clicked.
     */
    public void OneA(View view){
        scoreTeamA = scoreTeamA + 1;
        displayForTeamA(scoreTeamA);
    }

    /**
     * This method is called when the +3 points button is clicked.
     */
    public void ThreeB(View view){
        scoreTeamB = scoreTeamB +3;
        displayForTeamB(scoreTeamB);
    }

    /**
     * This method is called when the +2 points button is clicked.
     */
    public void TwoB(View view){
        scoreTeamB = scoreTeamB +2;
        displayForTeamB(scoreTeamB);
    }

    /**
     * This method is called when the FREE THROW button is clicked.
     */
    public void OneB(View view){
        scoreTeamB = scoreTeamB + 1;
        displayForTeamB(scoreTeamB);
    }


}

Нужно ли мне менять My SettingActivity и SettingsFragment поможет решить эту проблему или он не нужен?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Если вы хотите, чтобы они сохранялись, когда приложение полностью закрыто, SharedPreferences - это то, что вы ищете. Это хранилище ключ / значение , которое позволяет хранить данные, которые сохраняются даже после уничтожения активности. По сути, они состоят из двух частей:

  1. Ключ - это уникальный идентификатор, используемый для доступа к данным
  2. Значение - это фактические данные, которые вы пытаетесь сохранить

Итак, сначала вы получите ссылку на ваши общие настройки, используя

SharedPreferences.Editor editor = getSharedPreferences(
  MY_PREFS_NAME, MODE_PRIVATE).edit();

Это MY_PREFS_NAME может быть любой строкой, которая вам нравится. Это позволяет вам получить доступ к вашей «части» общих предпочтений. Как только вы получите эту ссылку, теперь вы можете начать читать и писать в них.

Чтобы написать:

editor.putInt("scoreViewA", 5);
editor.putInt("scoreViewB", 12);
editor.apply();

И позже, чтобы прочитать:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
int scoreViewA = prefs.getInt("scoreViewA", 0);
int scoreViewB = prefs.getInt("scoreViewB", 0);

Эта секунда параметр в getInt - это значение по умолчанию, которое будет использоваться, если данный ключ не найден. Обратите внимание, что еще раз вы должны использовать тот же MY_PREFS_NAME при получении ссылки на общие настройки.

Наконец, обратите внимание, что при записи в общие настройки мы вызываем edit() перед записью любых изменений, и мы вызываем apply() после этого.

Вы захотите поместить свой код для записи в общие настройки в вашем методе onPause. Это срабатывает, когда активность больше не находится на переднем плане. Затем прочтите по методу onResume. Этот метод срабатывает, когда приложение восстанавливает фокус на переднем плане.

@Override
public void onPause() {
  super.onPause();
  // write to shared preferences
}

@Override
public void onResume() {
  super.onResume();
  // read from shared preferences
}

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

Надеюсь, что это поможет, добро пожаловать в Stackoverflow!

1 голос
/ 15 июля 2020

Я наконец разобрался, это было очень катарти c. Моя основная проблема заключалась в том, чтобы выяснить, где разместить методы, и похоже, что мне не нужны методы onPause() и onResume().

Сначала в файле AndroidManifest. xml, который я добавил android:launchMode="singleTop" но, в конце концов, это было не нужно, так как мне удалось сохранить настройки.

В моих методах отображения я добавил SharedPreferences myScoreB = getSharedPreferences("teamBScore", Context.MODE_PRIVATE); SharedPreferences.Editor editor = myScoreB.edit();editor.putInt("scoreB", scoreTeamB);editor.commit();

Часть данных для чтения сбивала с толку, но в конце концов мне удалось чтобы сделать это в методе oncreate SharedPreferences myScoreB = this.getSharedPreferences("teamBScore", Context.MODE_PRIVATE);scoreTeamB = myScoreB.getInt("scoreB", 0);scoreViewB.setText(String.valueOf(scoreTeamB));

Теперь он обрабатывает повороты экрана без воссоздания всего макета, а также перезапускает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...