2017-05-08 109 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

希望这将有助于〜