【问题标题】:How to use sharedPreferences here?如何在这里使用 sharedPreferences?
【发布时间】:2013-03-15 12:06:20
【问题描述】:

我有一些设置值的微调器,其中四个。我希望他们在启动之间保留当前设置。当您在微调器中选择一个值时,它不应该保存该值,直到按下 updateSettings 按钮。我该怎么办?

这里有一些代码,在 onCreate 我使用默认值制作微调器:

    mBaudSpinner = (Spinner) findViewById(R.id.bannerBaudSpinner);
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
            this, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mBaudSpinner.setAdapter(adapter);
    String[] tempArray = SlickUSB2Serial.BAUD_RATES;
    for (int i = 0; i < tempArray.length; i++) {
        adapter.add(tempArray[i]);
    }
     mBaudSpinner.setSelection(SlickUSB2Serial.BaudRate.BAUD_9600.ordinal());


    mDataSpinner = (Spinner) findViewById(R.id.bannerDataSpinner);
    adapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mDataSpinner.setAdapter(adapter);
    tempArray = SlickUSB2Serial.DATA_BITS;
    for (int i = 0; i < tempArray.length; i++) {
        adapter.add(tempArray[i]);

    }
    mDataSpinner
            .setSelection(SlickUSB2Serial.DataBits.DATA_8_BIT.ordinal());

    mParitySpinner = (Spinner) findViewById(R.id.bannerParitySpinner);
    adapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mParitySpinner.setAdapter(adapter);
    tempArray = SlickUSB2Serial.PARITY_OPTIONS;
    for (int i = 0; i < tempArray.length; i++) {
        adapter.add(tempArray[i]);

    }
    mParitySpinner.setSelection(SlickUSB2Serial.ParityOption.PARITY_NONE
            .ordinal());

    mStopSpinner = (Spinner) findViewById(R.id.bannerStopSpinner);
    adapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mStopSpinner.setAdapter(adapter);
    tempArray = SlickUSB2Serial.STOP_BITS;
    for (int i = 0; i < tempArray.length; i++) {
        adapter.add(tempArray[i]);

    }
    mStopSpinner
            .setSelection(SlickUSB2Serial.StopBits.STOP_1_BIT.ordinal());

如果我单击 updateSettings,则运行此代码:

else if (v == mUpdateSettings) {
            if (mSelectedAdapter == null) {
                return;
            }

            mSelectedAdapter.setCommSettings(BaudRate.values()[mBaudSpinner
                    .getSelectedItemPosition()], DataBits.values()[mDataSpinner
                    .getSelectedItemPosition()],
                    ParityOption.values()[mParitySpinner
                            .getSelectedItemPosition()],
                    StopBits.values()[mStopSpinner.getSelectedItemPosition()]);

   } 

我正在尝试将这样的偏好用于一个微调器作为示例,它是否在正确的轨道上?

 SharedPreferences prefs;
         prefs = PreferenceManager.getDefaultSharedPreferences(this);
         SharedPreferences.Editor prefEditor = prefs.edit();
         prefEditor.putString("savedValue",mBaudSpinner.getSelectedItem().toString());
         prefEditor.commit();
         String username = prefs.getString("savedValue", String.valueOf(SlickUSB2Serial.BaudRate.BAUD_9600.ordinal()));
         mBaudSpinner.setSelection(Integer.parseInt(username));

你是做什么的,我是否将 sharedPrefs 的东西设为全局,以便它可以在 onCreate 和按钮单击侦听器中使用?然后将设置微调器默认值的行更改为以下示例:

String username = prefs.getString("savedValue", String.valueOf(SlickUSB2Serial.BaudRate.BAUD_9600.ordinal()));
             mBaudSpinner.setSelection(Integer.parseInt(username));

然后把关于保存值的其他内容放在按钮监听器中?我正在尝试这个,但状态没有保存并且总是默认为错误的值。我做的对吗?

编辑

这些行好像没有设置默认值,这是为什么呢?

prefs = PreferenceManager.getDefaultSharedPreferences(this);
         String username = prefs.getString("savedValue", Integer.toString(SlickUSB2Serial.BaudRate.BAUD_9600.ordinal()));
         mBaudSpinner.setSelection(Integer.parseInt(username)); 

【问题讨论】:

  • 如果你的类是Activity,尽量使用getPreferencesgetSharedPreferences而不是PreferenceManager.getDefaultSharedPreferences(this);
  • 我修复了这个错误,你的方式也给出了一个空指针。显然你不能在全球范围内使用上下文?它会导致一个空指针,所以我只是在代码的下方设置它。现在我的问题仍然是下拉菜单永远不会设置正确
  • 感谢 bruno,我会查找差异。这是一项活动
  • @BrunoMateus .. 为什么?我通常使用你的建议.. 但性能差异是什么
  • 你确定你用这个mBaudSpinner.getSelectedItem().toString()得到了正确的值吗?

标签: android sharedpreferences


【解决方案1】:

看,当你打电话时:

 mBaudSpinner.getSelectedItem()

你有一个对象并将其转换为字符串。当你打电话时:

 mBaudSpinner.setSelection(Integer.parseInt(username))

你得到字符串并转换为 int。但是,setSelectionshould 接收一个 int 位置并且 getSelectedItem 返回一个对象而不是项目位置。

【讨论】:

  • 感谢只是试图获得获得职位的最佳方式,我似乎正在绕弯路
  • 我不这么认为。但是,您应该重构代码并减小其大小。您可以使用此适配器构造函数来减少行数。 new ArrayAdapter&lt;CharSequence&gt;(this, ,android.R.layout.simple_spinner_item, SlickUSB2Serial.BAUD_RATES); 您可以将:BaudRate.values()[mBaudSpinner.getSelectedItemPosition()] 更改为 mBaudSpinner.getSelectedItem()。其他旋转器也是如此。
  • 谢谢,我能够从值中获取索引,所以现在一切正常。
猜你喜欢
  • 2010-11-07
  • 1970-01-01
  • 2015-04-21
  • 2019-06-15
  • 2021-10-25
  • 2018-03-14
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多