当前位置: 首页 > 知识库问答 >
问题:

SharedPreferences覆盖值

尤茂材
2023-03-14

我正在制作一个应用程序,其中我使用旋转器EditText按钮当用户填充文本并单击按钮时,文本将显示在旋转器中,我的问题是我做了所有的工作,但当我将数据添加到旋转器中时,它会覆盖上一个数据,上一个数据不会显示出来

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);

    }
}

共有1个答案

夏侯衡
2023-03-14

您可以通过保留单个ArrayAdapter并在单击按钮时更新它来实现该功能。此外,正如Code-Apprentice所说,您可以在preferenceondestory中以set 的形式保存数据。

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方法中对编辑文本值进行一些验证。

 类似资料:
  • 这是我第一次需要用字典做些事情。我不能覆盖item.value,我不知道该如何做到这一点。 编写一个程序,从标准输入到文件结束(EOF)的行中每行读取一只猴子的名字,以及它以以下格式收集的香蕉数量: monkey_name;香蕉数 程序将猴子的名字和它们收集到的香蕉数量以示例输出中给出的形式写入标准输出,并根据猴子的名字按词典升序! 输入: 输出: 下面是我的代码: 对不起,我的英语不好,我尽力了

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示:

  • 问题内容: 我的Java应用程序引用了一个使用log4j日志记录的第三方jar文件。问题是该jar包含自己的log4j.properties文件,这会导致我的机器上的访问被拒绝的异常,但是我无法控制jar文件来更改其内容。 我尝试在应用程序的类路径中添加自己的log4j.properties文件,但似乎没有效果。如果我尝试使用PropertyConfigurator以编程方式导入自己的设置,则lo

  • 在上一章中,我们讨论了超类和子类。 如果一个类从其超类继承一个方法,那么只要它没有标记为final,就有可能覆盖该方法。 覆盖的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法。 在面向对象的术语中,覆盖意味着覆盖现有方法的功能。 例子 (Example) 我们来看一个例子。 class Animal { public void move() { Sy