2016-03-01 48 views
0

我只是想從一個EDITTEXT用戶輸入存儲在共享的偏好,但它不工作:共享首選項? (非常簡單的問題!?)

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int keycode, KeyEvent event) { 

     Log.v(TAG, keyword.getString("keyword", "mDefault")); //IT LOGS OUT THE DEFAULT STRING EVEN **AFTER** STORING THE PREFERENCES BEFORE 

     if (keycode == EditorInfo.IME_ACTION_SEND) { 
      editText.setText(editText.getText().toString()); 

      keywordEditor.putString("keyword", editText.getText().toString()); 
      keywordEditor.commit(); 

      Log.v(TAG, keyword.getString("keyword", "default")); //CORRECT! THIS LINE WORKS 
      } 
     } 
    return true; 
}); 

當我第一次編輯的文字,我會首先得到「mDefault」的日誌,這是正常的,因爲沒有任何東西存儲在共享首選項中。

然後,我在共享首選項中存儲了一些內容,並確保它存儲,我登錄並獲取我輸入內容的日誌。 這意味着存儲的共享偏好數據WAS。

繼承人的問題:我已經存儲在共享偏好的東西后,我去一個不同的活動,我回來了,並且存儲在共享偏好的所有數據是不見了!

在瀏覽活動後,第一個日誌仍然顯示mDefault

問題是什麼?

編輯:

這裏是我的實例:

onCreate

keyword = PreferenceManager.getDefaultSharedPreferences(this); //Making a shared preferences 
     keywordEditor = keyword.edit(); 
+0

你怎麼了'keyword'實例? – Codebender

+0

@Codebender在'onCreate':'keyword = PreferenceManager.getDefaultSharedPreferences(this); //創建共享偏好 keywordEditor = keyword.edit();' –

+0

@Codebender我編輯了我的問題 –

回答

0

也許你不節省setOnEditorActionListener。保存當你去一個不同的活動。因爲當它進入不同的活動時,setOnEditorActionListener editText.getText()。toString()會返回null。

+0

對不起,我不太明白你在說什麼。你介意提供更多信息嗎?不是在執行'.commit()'應該保存它嗎?請告訴我! :) –

+0

請使用getSharedPreferences(「name」,Context.MODE_PRIVATE);如果您使用getDefaultSharedPreferences,則可能存在關鍵字「keyword」,並且在返回到活動時將其清除 –

+0

我需要從另一個活動訪問此共享首選項。你是什​​麼意思可能是關鍵的「關鍵字」,當回到活動清除?謝謝! –

0

非常重要:你需要一個首選項名稱(例如:「MY_PREFS_NAME」)來設置和檢索值:

SharedPreferences.Editor keywordEditor = context.getSharedPreferences("MY_PREFS_NAME", MODE_PRIVATE).edit(); 

使用相同的恆定首選項名稱,它會給你的在您的應用程序的任何位置都有相同的偏好

+0

以及** getDefaultSharedPreferences **和** getSharedPreferences **在存儲和檢索值中的區別? –

+1

'PreferenceManager.getDefaultSharedPreferences(this);'是完全有效的,並且每次都會給出相同的名稱。如果您查看源代碼,它會使用附加了「_preferences」的軟件包名稱作爲文件名,所以這不是問題。 – Naveed

+0

感謝您的回答Elenasys!是的,我和Naveed有同樣的困惑......'.getDefaultSharedPreferences(this)'有什麼問題,爲什麼在離開並重新開始活動後重置? –

0

蓄光的偏好:

SharedPreferences pref = getSharedPreferences("MyPrefs",Context.MODE_PRIVATE); 

    // We need an editor object to make changes 
    SharedPreferences.Editor edit = pref.edit(); 

    // Set/Store data 
    edit.putString("username", "Rishabh"); 
    edit.putString("password", "rishabh123"); 

    // Commit the changes 
    edit.commit(); 

RETRIEVING的偏好:

SharedPreferences pref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); 

    String username = pref.getString("username", ""); 
    String password= pref.getString("password", ""); 

    Log.d(TAG, username); 
    Log.d(TAG, password); 
+0

我如何從不同的活動訪問它? –

0

添加本作中,如果你錯過了一個關鍵組件的例子。這是目前的工作對我來說:

public class Main2Activity extends ActionBarActivity { 

    private SharedPreferences keyword; 
    private SharedPreferences.Editor keywordEditor; 
    private String TAG = "TAG"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 


     keyword = PreferenceManager.getDefaultSharedPreferences(this); //Making a shared preferences 
     keywordEditor = keyword.edit(); 

     final EditText editText = (EditText) findViewById(R.id.et_text); 


     findViewById(R.id.btn_launch).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(Main2Activity.this, Main22Activity.class); 
       startActivity(intent); 
      } 
     }); 

     editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int keycode, KeyEvent event) { 
       Log.v(TAG, "Initial: " + keyword.getString("keyword", "mDefault")); //IT LOGS OUT THE DEFAULT STRING EVEN **AFTER** STORING THE PREFERENCES BEFORE 

       if (keycode == EditorInfo.IME_ACTION_SEND) { 
        editText.setText(editText.getText().toString()); 

        keywordEditor.putString("keyword", editText.getText().toString()); 
        keywordEditor.commit(); 

        Log.v(TAG, "Saving in prefs: " + keyword.getString("keyword", "default")); //CORRECT! THIS LINE WORKS 
       } 
       return true; 
      } 
     }); 
    } 

} 

從一個全新的安裝:

我在「測試」中鍵入和命中因此鍵盤上的發送按鈕調用onEditorAction

然後點擊啓動新活動 - >回擊按鈕並鍵入「test2」並點擊發送按鈕。

以下是註銷認沽:

02-29 23:26:42.068 18105-18105/com.example.naveed.myapplication V/TAG: Initial: mDefault 
02-29 23:26:42.136 18105-18105/com.example.naveed.myapplication V/TAG: Saving in prefs: test 

02-29 23:26:53.281 18105-18105/com.example.naveed.myapplication V/TAG: Initial: test 
02-29 23:26:53.338 18105-18105/com.example.naveed.myapplication V/TAG: Saving in prefs: test2 

正如你最初看到這是「mDefault」,然後「測試」被保存。我發起了一項新的活動並且回來了。下一次初始是「測試」,因爲它是上次保存的,「test2」是保存的新值。

+0

這很奇怪,因爲這是我的樣子,但我的工作不正常。我正在使用多個不同的共享首選項(4),這可能是問題嗎?它可能是存儲空間嗎? –

+1

是的,如果您的設備上存儲空間不足,它可能會失敗。但只要你保存和檢索你的情況下的相同名稱的偏好getDefaultPreferences()它應該工作。 – Naveed

+0

我可以擁有多個共享首選項對象嗎? –

0

創建SharedPreferences

public class SharedPreferenceClass 
{ 
    // Shared Preferences 
    SharedPreferences pref; 
    // Editor for Shared preferences 
    SharedPreferences.Editor editor; 
    // Context 
    Context _context; 
    // Shared pref mode 
    int PRIVATE_MODE = 0; 
    // Sharedpref file name 
    private static final String PREF_NAME = "INTELLIJ_AMIYO"; 

    public static final String KEY_SET_VALUE= "KEY_SET_VALUE"; 

    public SharedPreferenceClass(Context context){ 
     this._context = context; 
     pref = _context.getSharedPreferences(PREF_NAME, 0); 
     editor = pref.edit(); 
    } 


    public void setUserDATA(String data) 
    { 
     editor.remove(KEY_SET_VALUE); 
     editor.putString(KEY_SET_VALUE, data); 
     editor.commit(); 
    } 

    public String getUserDATA() 
    { 
     String getData= pref.getString(KEY_SET_VALUE, null); 
     return getData; 
    } 

} 

現在把這個在你的活動部分全球

SharedPreferenceClass  sharedPrefClassObj; 

&呼叫的onCreate(捆綁savedInstanceState)部分

sharedPrefClassObj = new SharedPreferenceClass(getApplicationContext()); 

現在加入這個

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int keycode, KeyEvent event) { 


     if (keycode == EditorInfo.IME_ACTION_SEND) { 
      editText.setText(editText.getText().toString()); 
      sharedPrefClassObj.setUserDATA(editText.getText().toString()); // Set data 
      // Get data sharedPrefClassObj.getUserDATA(); 

      } 
     } 
    return true; 
}); 
0

蓄光的偏好:

SharedPreferences pref = getSharedPreferences("MyPrefs",Context.MODE_PRIVATE); 


SharedPreferences.Editor edit = pref.edit(); 


edit.putString("username", "Rishabh"); 
edit.putString("password", "rishabh123"); 


edit.commit(); 

檢索已首選項:

SharedPreferences pref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); 

    String username = pref.getString("username", ""); 
    String password= pref.getString("password", ""); 

    Log.d(TAG, username); 
    Log.d(TAG, password);