Как я могу применить SharedPreferences в этом коде? - PullRequest
0 голосов
/ 18 апреля 2020

Это мой первый 'le git проект' в android и java. Это простой счетчик с дополнительными функциями [большинство из которых еще предстоит добавить]. Я застрял с проблемой, когда я не могу сохранить счет, когда пользователь закрывает приложение. Предположим, что если кто-то нажал до 50, а затем просто закрыл приложение (не просто закрыть, а ЗАКРЫТЬ все приложение), поэтому при повторном открытии я хочу, чтобы оно продолжалось с 50.

Я знаю, что могу сделать это с поделился своими предпочтениями, но я попытался сделать это сам и просмотрел несколько видео на YouTube, но безрезультатно. Это просто не будет работать, или приложение вылетает.

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

package com.example.tapcounter;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Display;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;

public class MainActivity extends AppCompatActivity {

    private AdView mAdView ;
    private int counter = 0;
    TextView txt;
    Button btnU,btnT,btnR;
    Switch sw;

    private static long back_pressed;

    //Double Tap Exit
    @Override
    public void onBackPressed()
    {
        if (back_pressed + 2000 > System.currentTimeMillis()) super.onBackPressed();
        else Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
        back_pressed = System.currentTimeMillis();
    }


    //Inflater for Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu,menu);
        return true;

    }

    //Menu
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case R.id.menui1:
                Intent aboutIntent = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(aboutIntent);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713");
        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        btnT =  findViewById(R.id.tapbtn);
        btnR =  findViewById(R.id.resetbtn);
        btnU =  findViewById(R.id.undobtn);
        sw = findViewById(R.id.swch);
        txt =  findViewById(R.id.txtv);

;


        //TAP Button
        btnT.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                counter ++;
                txt.setText(Integer.toString(counter));

            }
        });


        //UNDO Button
        btnU.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(counter > 0) {
                    counter--;
                    txt.setText(Integer.toString(counter));
                }
                else{
                    return;
                }
            }
        });

        //RESET Button
        btnR.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                counter = 0;
                txt.setText(Integer.toString(counter));
            }
        });

        //Lock Switch
        sw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(sw.isChecked()) {
                    btnR.setEnabled(false);
                    btnT.setEnabled(false);
                    btnU.setEnabled(false);
                }
                else{
                    btnR.setEnabled(true);
                    btnT.setEnabled(true);
                    btnU.setEnabled(true);
                }
            }
        });

    }
}

Не знаю, нужен ли xml код, но вот вам go .

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    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="fill_parent"
    android:background="@color/BG"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/MainLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/BG"
        tools:context=".MainActivity">

        <Button
            android:id="@+id/undobtn"
            android:layout_width="103dp"
            android:layout_height="70dp"
            android:text="@string/undobtnS"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.051"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tapbtn"
            app:layout_constraintVertical_bias="1.0" />

        <Button
            android:id="@+id/resetbtn"
            android:layout_width="100dp"
            android:layout_height="70dp"
            android:text="@string/restbtnS"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tapbtn"
            app:layout_constraintVertical_bias="1.0" />

        <Switch
            android:id="@+id/swch"
            android:layout_width="102dp"
            android:layout_height="70dp"
            android:layout_marginTop="39dp"
            android:text="@string/swchS"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.948"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tapbtn"
            app:layout_constraintVertical_bias="0.748" />

        <TextView
            android:id="@+id/txtv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/txtvS"
            android:textSize="130sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="@+id/tapbtn"
            app:layout_constraintVertical_bias="0.325" />

        <Button
            android:id="@+id/tapbtn"
            android:layout_width="415dp"
            android:layout_height="450dp"
            android:layout_marginTop="92dp"
            android:alpha="0.1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <com.google.android.gms.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            app:adSize="SMART_BANNER"
            app:adUnitId="ca-app-pub-3940256099942544/6300978111"
            app:layout_constraintBottom_toTopOf="@+id/tapbtn"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

        </com.google.android.gms.ads.AdView>

    </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вы можете создать общее предпочтение следующим образом

   public class MySharedPref {

      //Shared Preferences
        SharedPreferences pref;

      //Editor for Shared preferences
        SharedPreferences.Editor editor;

      //context
        Context context;

      //shared pref mode
        int PRIVATE_MODE=0;

      //shared pref file name
       public static final String PREF_NAME="MySharedPref";


       public MySharedPref(Context context){
            this.context=context;
            pref=context.getSharedPreferences(PREF_NAME,PRIVATE_MODE);
            editor=pref.edit();
        }

        public void changeCount(String count){
             editor.putString("Count",count);
             editor.commit();
          }

        public String getCount(){
             return pref.getString("Count","0");
        }
      }

Затем в своей основной деятельности вы можете использовать его как -

    MySharedPref mySharedPref; //declare it

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       mySharedPref=new MySharedPref(getApplicationContext());
       //other part
    }

     //TAP Button
    btnT.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            counter ++;
            mySharedPref.changeCount(Integer.toString(counter));
            //other part
        }
    });


    //UNDO Button
    btnU.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(counter > 0) {
                counter--;
                mySharedPref.changeCount(Integer.toString(counter));
                //other part
            }
            else{
                return;
            }
        }
    });

    //RESET Button
    btnR.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            counter = 0;
            mySharedPref.changeCount(Integer.toString(counter));
            //other part
        }
    });

Вы можете получить последний сохраненный счет после повторного открытие с помощью mySharedPref.getCount() как

      txt.setText(mySharedPref.getCount());

Надеюсь, это поможет

0 голосов
/ 18 апреля 2020

Вы должны сохранить значение счетчика при вызове метода onStop или onDestroy жизненного цикла операции, а в методе onResume или onCreate вы должны получить это значение.

Чтобы сохранить целочисленные значения с помощью общих настроек:

SharedPreferences.Editor editor =  getContext().getSharedPreferences("NAME_OF_SHARED_PREF" , MODE_PRIVATE).edit();
editor.putInt("KEY_NAME_HERE" , COUNTER_INT_VALUE_HERE);

, и вы можете получить значение следующим образом:

SharedPreferences prefs = getActivity().getApplicationContext().getSharedPreferences("NAME_OF_SHARED_PREF", MODE_PRIVATE);
int counter = prefs.getInt("KEY_NAME_HERE", ANY_DEFAULT_VALUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...