![](/img/trans.png)
[英]SharedPreferences causes app to force close when using Tabs in android
[英]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.