如何保存和恢复用户最后看到的图像视图?

How can I save and restore the last Image View seen by the user?

我目前正在 Android Studio 中开发 android 音乐阅读应用程序。我使用的语言是Java,但我是初学者(也很抱歉我的英语)。

该应用程序有几个练习。理想情况下,人们可以点击下一步或后退按钮来查看一个或另一个练习。问题是我也在寻找用户,即使他退出应用程序,也要继续上次看到的练习(图片)。

我已经阅读了有关活动周期的内容并且我理解它,但是由于我是这门语言的初学者,所以我不能做我需要做的事情。我了解到 OnSaveInstanceState 或 OnRestoreInstanceState 不能解决我的问题,解决方案可能是使用 SharedPreferences,但我不知道如何将它应用到我当前拥有的代码中。使用 SharedPreferences,我希望我可以保存和恢复上次看到的图像视图,并且我可以通过单击下一步或返回从那里继续。

这是当前代码,它允许我:显示初始练习并从一个练习转到另一个练习。

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int image_index = 0 ;
    private static final int MAX_IMAGE_COUNT = 3;

    private int[] mImageIds = {
            R.raw.image1,
            R.raw.image2,
            R.raw.image3};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showImage();
    }
    private void showImage() {
        ImageView imgView = (ImageView) findViewById(R.id.myimage);
        imgView.setImageResource(mImageIds[image_index]);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

            case (R.id.previous_btn):
                image_index--;
                if (image_index == -1) {
                    image_index = MAX_IMAGE_COUNT - 1;
                } else {
                }
                showImage();
                break;

            case (R.id.next_btn):
                image_index++;
                if (image_index == MAX_IMAGE_COUNT) {
                    image_index = 0;
                } else {
                }
                showImage();
                break;
        }
    }
}

这是xml

<?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="match_parent"
    android:background="@android:color/background_light"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:fontFamily="@font/gilroyextrabold"
                android:text="Ejercicios"
                android:textColor="@android:color/black"
                android:textSize="24sp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:id="@+id/myimage"
                android:layout_width="wrap_content"
                android:layout_height="370dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textView" />

            <LinearLayout
                android:id="@+id/linearLayout5"
                android:layout_width="match_parent"
                android:layout_height="54dp"
                android:layout_marginStart="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="40dp"
                android:layout_marginEnd="10dp"
                android:layout_marginRight="10dp"
                android:orientation="horizontal"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/myimage">

                <Button
                    android:id="@+id/previous_btn"
                    android:layout_width="190dip"
                    android:layout_height="wrap_content"
                    android:background="@drawable/btnatsslf"
                    android:onClick="onClick" />

                <Button
                    android:id="@+id/next_btn"
                    android:layout_width="190dip"
                    android:layout_height="wrap_content"
                    android:background="@drawable/btnsgtslf"
                    android:onClick="onClick" />
            </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </LinearLayout>
</ScrollView>

由于我没有那么多知识,我寻求你的帮助,我也有其他选择。

将这些行放在 setContentView 之后,但在 onCreate

中的 showImage 之前
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    image_index = sp.getInt("image_index", image_index);

并将此值保存在 showImagesetImageResource

之后
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    sp.edit().putInt("image_index", image_index).apply();

您可以保留对 SharedPreferences sp 作为 class 成员的引用,这样就不需要在每次调用 showImage 时都获取它(ImageView 也应该以相同的方式存储,而不需要每次 findViewById)。密钥 ("image_index") 也可以存储为一些 private static final String class 成员

还请记住以备将来使用:这是您已声明为静态的某个数组中的索引。当你改变它时,例如存储值为 2 并且您剪切图像数组中的最后一项然后用户在安装应用程序更新后得到索引越界异常,因此在 onCreate 中检查该值是否在数组范围内(只是为了安全)