簡體   English   中英

強制關閉應用程序時,SharedPreferences If / Else語句無法正常工作

[英]SharedPreferences If/Else Statement does not work correctly when I force close app

問題摘要:當我通過打開任務窗口並滑動它來強制關閉應用程序時,我的if / else語句無法正常運行。 我將“名稱選擇”活動作為“默認啟動器”活動。 僅在沒有Shared Prefs時才彈出名稱選擇活動,這意味着用戶尚未從微調器中選擇名稱。 但是即使用戶選擇了一個名稱並將其存儲在Share Prefs中,當我強制關閉該應用程序時,我仍然會返回到名稱選擇活動

我嘗試過的東西我嘗試if (stringNamePackage.equals(""))if (stringNamePackage == "")if (NAME.equals(""))if (NAME == "")這是因為也許我的Shared Prefs沒有正確保存名稱,但事實並非如此,當我強制關閉名稱時,該名稱仍然正確顯示。 但是,當我嘗試添加if / else語句時,無論我是否在Shared Prefs中保存了名稱,它總是只會將我發送回名稱選擇活動。 我花了4個小時試圖使它生效,但我無能為力。 我還花了幾個小時查看有關如何保存和檢索Shared Pref數據的不同堆棧文章。 我什至嘗試了如何檢查SharedPreferences字符串是否為空或為空* 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語句並讓用戶選擇一個名稱。 這是我在“主要活動”中獲取和設置名稱的方法:

在onCreate中

獲得名字

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中是否具有名稱。 如果他們有名字,他們將直接進入主要活動。 如果沒有,他們將返回到“名稱選擇活動”。

要獲取數據並將數據存儲到您的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);

它們每個都是存儲共享首選項的不同文件,您可以省略前置點. ,但是為了命名一致性,最好保持一致性,實際上並不需要額外的密鑰,但是如果您有某種OCD,可能會“放松” ;-)。

然后,您可以使用Android Studio的設備資源管理器瀏覽共享首選項,它們位於“數據/數據/ your.package.name / shared_prefs”下

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM