Android共享引用混乱

Android共享引用混乱,android,sharedpreferences,Android,Sharedpreferences,我是android的初学者,我对共享偏好的实现感到困惑。我的目标是使用一个字符串,其中用户定义了一些将在main片段中使用的文本。考虑到用户在应用程序运行时可能会更改该字符串,我还需要一个侦听器。因此,根据目前为止的一本书,我有一个SettingsActivity和一个SettingsFragment 到目前为止的设置活动: public class SettingsActivity extends AppCompatActivity { private SharedPreferences p

我是android的初学者,我对共享偏好的实现感到困惑。我的目标是使用一个字符串,其中用户定义了一些将在main片段中使用的文本。考虑到用户在应用程序运行时可能会更改该字符串,我还需要一个侦听器。因此,根据目前为止的一本书,我有一个SettingsActivity和一个SettingsFragment

到目前为止的设置活动:

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");

}

}
到目前为止,设置碎片:

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) {

}
}
我的问题是:

•我应该用哪种方法以及如何保存用户更改的值


•如何实现侦听器,使其通知主片段字符串已更改?

1。要使用
EditTextPreference
实现
设置活动
,首先必须创建一个包含
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>
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);
    }
}
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();
    }

}
3.最后,创建
SettingsActivity
并在其
FrameLayout
上显示
SettingsFragment

SettingsActivity.java:

<?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>
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);
    }
}
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();
    }

}
如何使用:

<?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>
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);
    }
}
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();
    }

}
要使用
首选项中更新的
名称
,请从
首选项
中获取
名称
值,该值位于
活动
片段
onResume()
方法中:

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
        ................
        ........................
    }
}
输出:

<?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>
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);
    }
}
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();
    }

}


希望这会有所帮助~

这些是设置活动和片段的类,您可能不需要它们。我不知道你想做什么,但是如果你知道用户什么时候可以更改这个字符串,你可以在它之后检查它是否有更改。SharedReferences可用于所有活动和片段类。@fapps我试图为用户提供更改姓名的功能。我决定在菜单中放置一个名为“设置”的选项卡,其中EditTextPreference允许用户写下自己的名字。这就是我创建这些类的原因。因此,如果您在xml布局中使用EditTextPreference,只需使用
key=“stringIWantToSave”
设置键值,即可完成所需的所有操作。没有额外的代码。