如何保存和恢复用户最后看到的图像视图?
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);
并将此值保存在 showImage
内 setImageResource
行
之后
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
中检查该值是否在数组范围内(只是为了安全)
我目前正在 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);
并将此值保存在 showImage
内 setImageResource
行
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
中检查该值是否在数组范围内(只是为了安全)