2017-05-08 105 views
0

我是Android的初學者,我對共享首選項實現有困惑。我的目標是在用戶定義一些將在MainFragment中使用的文本時使用一個字符串。鑑於用戶在運行應用程序時可能會更改該字符串,我還需要一個偵聽器。所以根據迄今爲止的一本書,我有一個SettingsActivity和一個SettingsFragment。Android SharedPreferences混淆

SettingsActivity至今:

public class SettingsActivity extends AppCompatActivity { 

private SharedPreferences prefs; 
private String stringIWantToSave; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_settings); 
    getFragmentManager().beginTransaction(). 
      replace(android.R.id.content, new SettingsFragment(), "settings_fragment").commit(); 
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    stringIWantToSave = prefs.getString("stringIWantToSave", "myString"); 

} 

} 

SettingsFragment至今:

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

private SharedPreferences sharedPreferences; 
private String stringIWantToSave; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
} 

@Override 
public void onPause() { 
    sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    sharedPreferences.getString("stringIWantToSave", "myString"); 
    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 

} 
} 

我的問題是:

•在哪一種方法,我應該如何保存在用戶更改的價值?

•如何實現偵聽器,以便它通知MainFragment字符串已更改?

+0

這些都是班設置活動和片段,你可能不會需要他們。我不知道你在做什麼,但是如果你知道用戶什麼時候可以改變這個字符串,你可以在它後面檢查它是否有變化。 SharedPreferences可用於所有Activity和Fragment類。 – fapps

+0

@fapps我想提供用戶改變的能力讓我們說他的名字。我決定放置一個菜單,並在菜單內放置一個標籤,其中EditTextPreference將允許用戶寫下他的名字。這就是爲什麼我創建了這些類。 – kDoyle

+0

因此,如果您在xml佈局中使用EditTextPreference,只需使用'key =「stringIWantToSave」'設置鍵值,並且您可以完成所有需要的操作。沒有額外的代碼。 – fapps

回答

0

爲了實現SettingsActivityEditTextPreference,首先你必須創建一個PreferenceScreen包含EditTextPreference

的preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

    <EditTextPreference 
     android:key="pref_key_name" 
     android:title="Name" 
     android:summary="Enter your name here!" 
     android:dialogTitle="Enter name:"> 

    </EditTextPreference> 
</PreferenceScreen> 

2.創建Fragment延伸PreferenceFragment。當user輸入他們的name時,請選擇initialization並添加OnSharedPreferenceChangeListenerupdate

SettingsFragment.java:

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

    // Preference Keys 
    public static final String KEY_PREF_NAME = "pref_key_name"; 

    // Shared preference 
    SharedPreferences mSharedPreferences; 

    // Name preference 
    EditTextPreference mPreferenceName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     // Shared preference 
     mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

     // Name preference 
     mPreferenceName = (EditTextPreference) getPreferenceScreen().findPreference(KEY_PREF_NAME); 

     // Initialize 
     initPreferences(); 
    } 

    public void initPreferences() 
    { 
     // Name 
     String oldName = mSharedPreferences.getString(KEY_PREF_NAME, "Enter your name here!"); 
     // Update view 
     mPreferenceName.setSummary(oldName); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) { 

     if(key.equals(KEY_PREF_NAME)) 
     { 
      // Name 
      String currentName = sharedPref.getString(key, "DEFAULT_VALUE"); 
      // Update view 
      mPreferenceName.setSummary(currentName); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 
} 

最後,創建SettingsActivity並顯示其FrameLayoutSettingsFragment

SettingsActivity.java:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 

public class SettingsActivity extends AppCompatActivity { 

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

     // Settings Fragment 
     SettingsFragment settingsFragment = new SettingsFragment(); 
     getFragmentManager().beginTransaction().replace(R.id.content, settingsFragment).commit(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

} 

使用方法:

使用從preference更新name,得到preferencename值的activityfragmentsonResume()方法中:

public class MainActivity extends AppCompatActivity { 

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

    @Override 
    protected void onResume() { 
     super.onResume(); 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     // Name 
     String name = sharedPreferences.getString(SettingsFragment.KEY_PREF_NAME, "DEFAULT_VALUE"); 

     // Do something with name 
     ................ 
     ........................ 
    } 
} 

OUTPUT:

enter image description here

希望這將有助於〜