【问题标题】:SharedPreferences If/Else Statement does not work correctly when I force close app当我强制关闭应用程序时,SharedPreferences If/Else 语句无法正常工作
【发布时间】:2020-01-07 15:44:04
【问题描述】:

问题总结:当我通过打开任务窗口并滑动它来强制关闭应用程序时,我的 if/else 语句无法正常工作。我将名称选择活动作为默认启动器活动。只有在没有 Shared Prefs 时才会弹出名称选择 Activity,这意味着用户尚未从微调器中选择名称。但即使用户选择了一个名称并将其存储在共享首选项中,当我强制关闭应用程序时,我仍然会返回到名称选择活动

我试过的我试过if (stringNamePackage.equals(""))if (stringNamePackage == "")if (NAME.equals(""))if (NAME == "")起初我以为是因为我的共享首选项可能没有正确保存名称,但是不是这样,当我强制关闭它时,名称仍然正确显示。但是,当我尝试添加 if/else 语句时,它总是将我发送回名称选择活动,无论我是否在共享首选项中保存了名称。我花了 4 个小时试图让它发挥作用,但我束手无策。我还花了几个小时查看有关如何保存和检索共享首选项数据的不同堆栈文章。我什至尝试了how to check the SharedPreferences string is empty or null *android,但它仍然无法正常工作。

NameSelectionActivity

public class NameSelection extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    Spinner nameSpinner;
    String stringNamePackage;
    Button bSaveSelection;
    Context context;
    public ArrayAdapter<CharSequence> adapter;
    public static String SHARED_PREFS = "sharedPrefs";
    public static String NAME = "name";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_name_selection);
        context = this;
        nameSpinner = findViewById(R.id.horizonNameSpinner);
        stringNamePackage = "";

        //Create the list to populate the spinner
        List<String> nameList = new ArrayList<>();
        nameList.add("01");
        nameList.add("02");
        nameList.add("03");

        //Array Adapter for creating list
        //adapter = ArrayAdapter.createFromResource(this, R.array., android.R.layout.simple_spinner_item);
        adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, nameList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
        nameSpinner.setAdapter(adapter);
        nameSpinner.setOnItemSelectedListener(this);

        //If User has not selected name, start this activity to allow user to pick Name, else, send user to Main Activity
        //else start MainActivity
        if (stringNamePackage .equals("")) {
            Toast.makeText(this, "Welcome, please select Name", Toast.LENGTH_LONG).show();
        } else {
            Intent sendToMainActIntent = new Intent(this, MainActivity.class);
            startActivity(sendToMainActIntent);
        }


        //Save Selection Button Code
        bSaveSelection = findViewById(R.id.bSaveSelection);
        bSaveSelection.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent myIntent = new Intent(view.getContext(), MainActivity.class);
                //Saves name to SharedPrefs
                saveName();
                //Sends user to MainActivity
                startActivity(myIntent);
                finish();
            }
        });


    }


    //Stores name selected in SharedPreferences
    public void saveName() {
        SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = app_preferences.edit();
        editor.clear();
        //Stores selection in stringNamePackage 
        editor.putString(NAME, stringNamePackage );
        editor.commit();

    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        //Put user selection into String text
        String text = adapterView.getItemAtPosition(i).toString();
        stringNamePackage = text;
    }

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

    }


}

主要活动 此活动案例的目的是在用户点击“测试”按钮时将其发送回名称选择屏幕,这将删除共享的首选项,因此触发 if/else 语句并让用户选择一个名称。这就是我在主活动中获取和设置名称的方式:

在创建时

取名

SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(context);
        nameSharedPref = app_preferences.getString(NAME, "");
        name.setText(nameSharedPref);

清算名称

SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
                SharedPreferences.Editor editor = mPrefs.edit();
                editor.clear();
                editor.commit();
                finish();

我的期望:我希望用户在第一次启动应用程序时必须选择一个名称。然后,每次他们打开应用程序时,if/else 语句都会检查用户是否在 Shared Prefs 中有名称。如果他们有名字,他们将直接进入主活动。如果他们不这样做,那么他们将返回名称选择活动。

【问题讨论】:

  • 这是学习使用调试器的好时机。这将允许您查看stringNamePackage 的值。此外,对于比较空字符串,这通常更可取:"".equals(str)。 Apache Commons Lang 对于常见的字符串操作也非常有帮助。 mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.9
  • 我将其更改为if ("".equals(stringDeviceNamePackage)) ,在我强制终止应用程序并且用户已经选择了一个名称并将其存储在共享首选项之后,它仍然将我发送到名称选择活动
  • 您是使用PreferencesManager 设置菜单或配置活动还是使用它来存储任意数据,不一定链接到UI?
  • 您的名称选择活动似乎没有从任何地方的共享首选项中获取名称...您如何期望它不是空字符串?
  • 想通了。 @Racu 你提出PreferencesManager让我回去更改代码。在阅读不同的解决方案 4 小时后,事情肯定会变得混乱。 SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); String nameSharedPref = sharedPreferences.getString(NAME, null); 然后我运行我的if (nameSharedPref == null) 并完全删除了PreferencesManager 并将其替换为 ``getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);``

标签: java android sharedpreferences


【解决方案1】:

要获取数据并将数据存储到您的 SharedPreferences,请使用以下命令:

SharedPreferences sharedPreferences = getSharedPreferences(getPackageName(), Context.MODE_PRIVATE);

PreferenceManager.getDefaultSharedPreferences(context) 用于构建“设置”屏幕或类似内容,第一个您使用它来存储/检索不一定绑定到 UI 的任意数据。

如果你想组织你的SharedPreferences,你可以附加到getPackageName()不同的键,比如:

getSharedPreferences(getPackageName() + ".booleans", Context.MODE_PRIVATE);
getSharedPreferences(getPackageName() + ".flags", Context.MODE_PRIVATE);
getSharedPreferences(getPackageName() + ".keys", Context.MODE_PRIVATE);

它们中的每一个都是存储共享首选项的不同文件,您可以省略前置点 .,但为了命名一致性,最好保留它,实际上不需要额外的键,但如果你有某种强迫症,可能是“放松”;-)。

然后您可以使用 Android Studio 的设备资源管理器浏览共享首选项,它们位于“data/data/your.package.name/shared_prefs”下

【讨论】:

  • 完美。经过数小时的研究解决方案,在某处使用 PreferenceManager 进行了尝试。感谢您提出并指出。
  • PreferenceManager 真的很强大,如果你想建立一个“设置”屏幕,它真的很容易,但对于任意数据或自己做你的“设置”屏幕SharedPreferences 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多