Общие настройки работают только для первого перезапуска приложения. При перезапуске приложения во второй раз названия карт не сохраняются - PullRequest
0 голосов
/ 12 октября 2019

Я создал приложение, которое добавляет карты, и название каждой карты устанавливается после ввода имени пользователя. Чтобы сохранить карточки и заголовок при перезапуске приложения, я использую sharedpreferences и сохраняю отдельные заголовки карточек в массиве. Проблема заключается в том, что после первого перезапуска приложения названия карт сохраняются, но при дальнейшем перезапуске приложений названия карт не сохраняются. Хотя количество карт все еще сохраняется.

    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>

1 Ответ

2 голосов
/ 13 октября 2019

Нет необходимости хранить каждую карту в методе 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();
        }
    }
}

Поэтому, когда вы нажимаете кнопку SAVE , только тогдаВы можете сохранить карту в SharedPref. Это сохранит ненужную операцию записи на sharedPref.

...