共享首选项仅适用于首次应用程序重新启动.重新启动应用时,不会保留卡片视图标题



>我创建了一个应用程序,该应用程序可以添加卡片,并且在从用户输入名称后在每张卡片上设置标题。为了在应用程序重新启动期间保留卡片和标题,我正在使用共享首选项并将各个卡片标题保存在数组中。问题是在首次应用程序重新启动后,卡标题将保留,但在进一步应用程序重新启动时,不会保留卡标题。虽然卡的数量仍然保留。

public class MainActivity extends AppCompatActivity { 
private CardView cardview;
private CardView cardview2;
private LinearLayout.LayoutParams layoutparams1;
private LinearLayout layout;
public SharedPreferences mSettings;
int mCount;
int i=0,j=0;
public TextView tv1;
public TextView tv4;
public TextView tv3;
String name;
String names[] = new String[10];
String key[] = {"A","B","C","D","F","G","H"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCount=0;
Button b1 = findViewById(R.id.button);
layout=findViewById(R.id.view);
tv1 = findViewById(R.id.textView);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
names[mCount] = tv1.getText().toString().trim();
mCount++;
saveName();
}
});
}
private void saveName()    //Cardview-1 function to 
{
cardview = new CardView(getApplicationContext());
layoutparams1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutparams1.setMargins(18, 30, 18, 0);
cardview.setLayoutParams(layoutparams1);
cardview.setCardBackgroundColor(Color.WHITE);
cardview.setMinimumHeight(400);
tv3 = new TextView(getApplicationContext());
tv3.setText(tv1.getText().toString().trim());
cardview.setRadius(30);
cardview.addView(tv3);
layout.addView(cardview);
}
private void saveName2()  //Cardview 2 function
{
cardview2 = new CardView(getApplicationContext());
layoutparams1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutparams1.setMargins(18, 30, 18, 0);
cardview2.setLayoutParams(layoutparams1);
cardview2.setCardBackgroundColor(Color.WHITE);
cardview2.setMinimumHeight(400);
tv4 = new TextView(getApplicationContext());
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
name = mSettings.getString(key[j],"");
tv4.setText(name);
j++;
cardview2.setRadius(30);
cardview2.addView(tv4);
layout.addView(cardview2);
}
@Override
public void onPause() {
super.onPause();
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mSettings.edit();
editor.putInt("COUNT_CARDS", mCount);
for(int i=0; i<mCount; i++)
editor.putString(key[i],names[i]);
editor.commit();
}
@Override
public void onResume() {
super.onResume();
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
if(mSettings.contains("COUNT_CARDS"))
{
mCount = mSettings.getInt("COUNT_CARDS", 0);
for (int i=0; i<mCount; i++)
saveName2();
}
}
}

XML 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:id="@+id/layout"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/view"
android:orientation="vertical"
android:layout_marginTop="200dp"
android:background="@color/cardview_dark_background">
</LinearLayout>
<EditText
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="40dp" />
</RelativeLayout>

不需要在onPause(( 方法中存储每张卡。我们只会在 sharedPref 中写入新卡,因为上一个卡已经在 sharedPref 中预先设置了。因此,当您尝试将上一个卡保存在循环中时,会出现问题。(写入空白值(。

public class MainActivity extends AppCompatActivity {
private CardView cardview;
private CardView cardview2;
private LinearLayout.LayoutParams layoutparams1;
private LinearLayout layout;
public SharedPreferences mSettings;
int mCount;
int i=0,j=0;
public TextView tv1;
public TextView tv4;
public TextView tv3;
String name;
String names[] = new String[10];
String key[] = {"A","B","C","D","F","G","H"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCount=0;
Button b1 = findViewById(R.id.button);
layout=findViewById(R.id.view);
tv1 = findViewById(R.id.textView);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
names[mCount] = tv1.getText().toString().trim();
mCount++;
saveName();
}
});
}
private void saveName()    //Cardview-1 function to
{
cardview = new CardView(getApplicationContext());
layoutparams1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutparams1.setMargins(18, 30, 18, 0);
cardview.setLayoutParams(layoutparams1);
cardview.setCardBackgroundColor(Color.WHITE);
cardview.setMinimumHeight(400);
tv3 = new TextView(getApplicationContext());
tv3.setText(tv1.getText().toString().trim());
cardview.setRadius(30);
cardview.addView(tv3);
layout.addView(cardview);
saveInPref();
}
private void saveInPref() {
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mSettings.edit();
editor.putInt("COUNT_CARDS", mCount);
editor.putString(key[mCount-1],names[mCount-1]);
editor.apply();
}
private void saveName2()  //Cardview 2 function
{
cardview2 = new CardView(getApplicationContext());
layoutparams1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutparams1.setMargins(18, 30, 18, 0);
cardview2.setLayoutParams(layoutparams1);
cardview2.setCardBackgroundColor(Color.WHITE);
cardview2.setMinimumHeight(400);
tv4 = new TextView(getApplicationContext());
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
name = mSettings.getString(key[j],"");
tv4.setText(name);
j++;
cardview2.setRadius(30);
cardview2.addView(tv4);
layout.addView(cardview2);
}

@Override
public void onResume() {
super.onResume();
mSettings = getSharedPreferences("APP_PREFERENCES", Context.MODE_PRIVATE);
if(mSettings.contains("COUNT_CARDS"))
{
mCount = mSettings.getInt("COUNT_CARDS", 0);
for (int i=0; i<mCount; i++)
saveName2();
}
}
}

因此,当您单击"保存"按钮时,只有您可以将卡保存在SharedPref中。这将节省在共享Pref上不必要的写入操作。

最新更新