SharedPreferences 覆盖值

SharedPreferences overwrite value

我正在制作一个应用程序,其中我正在使用 SpinnerEditTextButton,当用户填写该文本并单击 Button 文本时显示在 Spinner 中,我的问题是我做了所有的事情,但是当我将数据添加到 Spinner 时,它会覆盖以前的数据并且以前的数据不会显示

public class MainActivity extends Activity {
    Spinner spinner1;
    Button add;
    EditText subject;
    ArrayAdapter btArrayAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner1 = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter dataAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(btArrayAdapter);
        add = (Button) findViewById(R.id.button);
        subject = (EditText) findViewById(R.id.editText);
        spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapter, View v,
                                       int position, long id) {
                String item = adapter.getItemAtPosition(position).toString();

                // Showing selected spinner item
                Toast.makeText(getApplicationContext(),
                        "Selected Subject : " + item, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {


            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SharedPreferences sharedPref =getSharedPreferences("Info", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("Spinner_name",subject.getText().toString());
        editor.commit();
    }

    public void btnClick(View view)
    {
        String content;
        content = subject.getText().toString();
        btArrayAdapter.add(content);
         btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
        btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    }
}

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.helloworld/com.example.helloworld.MainActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access0(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:153) at com.example.helloworld.MainActivity.(MainActivity.java:30) at java.lang.Class.newInstanceImpl(Native Method) at java.lang.Class.newInstance(Class.java:1319) at android.app.Instrumentation.newActivity(Instrumentation.java:1053) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  at android.app.ActivityThread.access0(ActivityThread.java:130)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:4745)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  at dalvik.system.NativeStart.main(Native Method)

editor.putString("Spinner_name",subject.getText().toString()); 

每次执行此操作时,旧字符串都会被覆盖。

首先,您应该将 ArrayAdapter 声明为 class 字段。然后在 onClick() 中,需要将每个 String 添加到 ArrayAdapter 中。最后在 onDestroy() 中,您可以将所有字符串保存到 SharedPreferences。

btArrayAdapter.add(content);
btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

在这里您正确地添加了字符串,但是您立即丢弃了适配器并创建了一个新的。不要那样做。您应该只在 onCreate() 中初始化一次适配器。

editor.putString("Spinner_name",subject.getText().toString()); 

这只保存最近的字符串。它还会覆盖前一个。您需要从适配器中获取所有字符串,然后将它们保存为字符串集。

您可以通过保持单一 ArrayAdapter 并在单击按钮时更新它来实现该功能。也正如 Code-Apprentice 所说,您可以在首选项 onDestory.

中以 Set<String> 的形式保存数据
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class MainActivity extends Activity {

    /* Views */
    Spinner spinner;
    Button add;
    EditText subject;

    /* Adapter */
    ArrayAdapter<String> dataAdapter;
    ArrayList<String> list = new ArrayList<String>();

    /* Preference */
    SharedPreferences sharedPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /* initializing views */
        spinner = (Spinner) findViewById(R.id.spinner);
        add = (Button) findViewById(R.id.button);
        subject = (EditText) findViewById(R.id.editText);

        /* Get spinner data from preference */
        sharedPref = getSharedPreferences("Info", Context.MODE_PRIVATE);
        Set<String> savedStringSet = sharedPref.getStringSet("SpinnerData", null);
        if (savedStringSet != null) {
            list = new ArrayList<>(savedStringSet);
        }

        /* Setting up spinner */
        dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,
                list.toArray(new String[list.size()]));
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapter, View v,
                                       int position, long id) {
                String item = adapter.getItemAtPosition(position).toString();

                // Showing selected spinner item
                Toast.makeText(getApplicationContext(),
                        "Selected Subject : " + item, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {


            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        /* save list in shared preference */
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putStringSet("SpinnerData", new HashSet<String>(list));
        editor.apply();
    }

    public void btnClick(View view) {
        String content = subject.getText().toString();      // get user entered text.

        /* update spinner */
        list.add(content);          // add to data list..
        dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        /* set updated spinner */
        spinner.setAdapter(dataAdapter);
    }
}

注意: 您可能需要在 btnClick 方法中进行一些验证,以编辑文本值,以防您不想在 "" 按钮点击。