Android共享首选项未保存



我有一个应用程序,它应该执行以下操作:显示第一个(主(活动每分钟都会更改的密码。密码更改前的剩余时间(秒(。第一个活动还有一个用于验证密码的按钮。一旦用户在第一个活动中单击"验证"按钮,第二个活动(验证窗口(就会启动并对用户可见。第二个活动应该有一个ListView,它显示以前生成的所有密码的所有时间戳,以及一个清除列表的按钮。一旦用户退出应用程序,列表将被清除,但最后一个时间戳将存储在共享的首选项中,并将在用户下次打开应用程序时恢复。应用程序应支持横向和纵向,并应在运行时处理屏幕方向的更改。

到目前为止,一切都应该正常,直到应用程序的最后一个时间戳保存在共享首选项中。当我退出应用程序并重新加载时,时间戳没有保存,也不确定原因。我已经包含了以下代码。谢谢,希望有人能帮忙。

package com.example.security_token_app;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity
{
static String PREF_NAME = "SharedPrefFile";
static SharedPreferences SavedTimeStamp;
static SharedPreferences.Editor editor;
static String TIMESTAMP_KEY = "TIMESTAMP_KEY";
private TextView countDownTextView;
TextView passCodeTextView;
static int passCode;
static String currentDateTime;
static ArrayList<String> arrayIntegerList = new ArrayList<String>();
Button verifyButton;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countDownTextView = (TextView)findViewById(R.id.textView4_time_remaining);
passCodeTextView= (TextView)findViewById(R.id.textView3_passCode_int);
verifyButton = (Button)findViewById(R.id.button1);
SavedTimeStamp = getSharedPreferences(PREF_NAME,0);
editor = SavedTimeStamp.edit();
if(MainActivity2.isSaved==true)
{
//MainActivity2.isSaved=false;
MainActivity2.restoreTimeStamp();
openSecondaryActivity();
}
createPassCode();
new CountDownTimer(60000, 1000)
{
@Override
public void onTick(long timeUntillFinished)
{
countDownTextView.setText("seconds remaining: " + timeUntillFinished / 1000 % 60);
}
@Override
public void onFinish()
{
createPassCode();
start();
}
}.start();
verifyButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
//                    if(MainActivity2.isSaved==true)
//                    {
//                        MainActivity2.restoreTimeStamp();
//                    }
openSecondaryActivity();
}
});
}
public void createPassCode()
{
int minute = Calendar.getInstance().get(Calendar.MINUTE);
passCode=minute*1245 + 10000;
String timeStamp = getTimeStamp();
arrayIntegerList.add(timeStamp);
String passCodeStr = Integer.toString(passCode);
passCodeTextView.setText(passCodeStr);
}
public void openSecondaryActivity()
{
Intent intent = new Intent(this, MainActivity2.class);
startActivity(intent);
}
public static int getPassCode()
{
return passCode;
}
public static String getTimeStamp()
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
currentDateTime = dateFormat.format(new Date());
return currentDateTime;
}

}
package com.example.security_token_app;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity2 extends AppCompatActivity
{
ArrayList<String> arrayList = new ArrayList<String>();
ListView listView;
Button clearButton;
int count;
String item;
static ArrayAdapter<String> adapter;
static boolean isSaved = false;
boolean adapterSet = false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
listView = (ListView) findViewById(R.id.listView1);
clearButton = (Button) findViewById(R.id.passButton);
for(String temp:MainActivity.arrayIntegerList)
{
arrayList.add(temp);
}
//adapter resset here? loses the saved time stamp
//        if(isSaved==true) //added
//        {
//            isSaved=false;
//            return;
//        }
if(isSaved==false)
{
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(adapter);
}
isSaved=false;
clearButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
count = adapter.getCount();
item = adapter.getItem(count-1);
adapter.clear();
adapter.add(item);
saveTimeStamp();
}
});
}
public void saveTimeStamp()
{
int i = adapter.getCount();
if(isSaved==true)  //changed from i==1
{
isSaved=false;
return;
}
String lastTimeStamp = adapter.getItem(i-1);
if(!lastTimeStamp.isEmpty())
{
MainActivity.editor.putString(MainActivity.TIMESTAMP_KEY, lastTimeStamp);
MainActivity.editor.commit();
Toast.makeText(getBaseContext(), "time stamp saved", Toast.LENGTH_SHORT).show();
isSaved = true;
}
else
{
Toast.makeText(getBaseContext(), "nothing saved", Toast.LENGTH_SHORT).show();
return;
}
}
public static void restoreTimeStamp()
{
String lastTimeStamp = MainActivity.SavedTimeStamp.getString(MainActivity.TIMESTAMP_KEY, "NOT LOCATED");
adapter.add(lastTimeStamp);
//Toast.makeText(getBaseContext(), "time stamp restored", Toast.LENGTH_SHORT).show();
}
}
<?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:id="@+id/root_constraint_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linear_layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:layout="@layout/activity_main">
<TextView
android:id="@+id/textView1_blueBox"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="0.25"
android:background="@color/sky_blue"
android:text="test" />
<TextView
android:id="@+id/textView2_passCode_string"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"
android:textAlignment="center"
android:text="PASS CODE"
android:textStyle="bold"
android:textSize="38sp"/>
<TextView
android:id="@+id/textView3_passCode_int"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"
android:textAlignment="center"
android:textSize="38sp"
android:textStyle="bold"
android:text="test" />
<TextView
android:id="@+id/textView4_time_remaining"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"
android:textAlignment="center"
android:textSize="24sp"
tools:text="1:00 seconds remaining"/>
<Button
android:id="@+id/button1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:text="Verify"
android:textStyle="bold"
/>


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

<?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=".MainActivity2">
<LinearLayout
android:id="@+id/linear_layout1"
android:layout_width ="match_parent"
android:layout_height ="match_parent"
android:orientation="vertical"
tools:layout="@layout/activity_main">
<TextView
android:id="@+id/textView1_blueBox"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="0.25"
android:background="@color/sky_blue" />
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textStyle="bold"
android:dividerHeight="32dp"
/>
<Button
android:id="@+id/passButton"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:text="PASS"
android:textStyle="bold"
/>




</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
count = adapter.getCount();
item = adapter.getItem(count-1);
adapter.clear();
adapter.add(item);
saveTimeStamp();

在清除适配器之前,可以尝试调用saveTimeStamp((吗?像这个

saveTimeStamp()
count = adapter.getCount();
item = adapter.getItem(count-1);
adapter.clear();
adapter.add(item);

我建议您在应用程序类中创建SharedPreferences。在这个类中重写oncreate方法

public class App extends Application{
public static SharedPreferences prefs;
@Override
public void onCreate(){
super.onCreate();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);   

}

然后你可以在你的项目中到处使用prefs,如下所示:

editor = App.prefs.edit();

最新更新