Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将“编辑文本首选项标题”设置为“编辑文本首选项标题”;“好的”;点击_Java_Android_Android Fragments_Sharedpreferences - Fatal编程技术网

Java 将“编辑文本首选项标题”设置为“编辑文本首选项标题”;“好的”;点击

Java 将“编辑文本首选项标题”设置为“编辑文本首选项标题”;“好的”;点击,java,android,android-fragments,sharedpreferences,Java,Android,Android Fragments,Sharedpreferences,当用户在框中输入值时,我使用此代码应用editTextPreference标题。 问题是,当我单击“确定”时,它不会更改标题,但只有当我重新单击editTextPreference时,它才会应用写入前的值 public void handleTEST(){ final EditTextPreference pref = (EditTextPreference)findPreference("test"); pref.setOnPreferenceClickListene

当用户在框中输入值时,我使用此代码应用editTextPreference标题。 问题是,当我单击“确定”时,它不会更改标题,但只有当我重新单击editTextPreference时,它才会应用写入前的值

public void handleTEST(){
  final EditTextPreference pref = (EditTextPreference)findPreference("test");       
    pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){   
        @Override
        public boolean onPreferenceClick(Preference preference) {
            pref.setTitle(pref.getText());

            return true;
        }
    });

}

那么我如何在“确定”点击时应用标题呢?

与问题匹配的简短答案:

public class SomePrefenceScreen extends PreferenceFragment implements
        OnSharedPreferenceChangeListener {

    private EditTextPreference edittext;

    private Context context;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        context = getActivity();
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.your_settings_xml);

        edittext = (EditTextPreference) getPreferenceScreen().findPreference("test");

    }

    @Override
    public void onStart() {
        updateAll();
        super.onStart();
    }

    @Override
    public void onResume() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .registerOnSharedPreferenceChangeListener(this);

        super.onResume();
    }

    @Override
    public void onPause() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .unregisterOnSharedPreferenceChangeListener(this);
        super.onPause();
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        updateAll();
    }

    private void updateAll() {
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);

        // test_key being the android:key defined in XML in your_settings_xml
        String titleString = sharedPrefs.getString("test_key", "");
        if (!titleString.isEmpty()) {
            edittext.setTitle(titleString);
        }

    }

}
public class GoogleMapsSettings extends DaggerPreferenceFragment implements
        OnSharedPreferenceChangeListener {

    private static final String TAG = "GoogleMapsSetings";

    private StatusCheck statusCheck;

    private ListPreference address_entry;
    private ListPreference city_entry;

    @Inject @ForActivity Context context;
    @Inject Preferences preferences;
    @Inject GoogleMapsModule googleMapsModule;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.settings_module_googlemaps);

        address_entry = (ListPreference) getPreferenceScreen().findPreference(
                getString(R.string.key_googlemaps_address_entry));

        city_entry = (ListPreference) getPreferenceScreen().findPreference(
                getString(R.string.key_googlemaps_city_entry));

    }

    @Override public void onStart() {
        updateAllSummaries();

        statusCheck = new StatusCheck(context, googleMapsModule, this);
        statusCheck.runCheck();
        super.onStart();
    }

    @Override public void onResume() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .registerOnSharedPreferenceChangeListener(this);

        super.onResume();
    }

    @Override public void onPause() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .unregisterOnSharedPreferenceChangeListener(this);
        super.onPause();
    }

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

        if (key.equals(getString(R.string.key_module_activated_googlemaps))) {
            statusCheck.runCheck();
        }

        updateAllSummaries();
    }

    private void updateAllSummaries() {
        SummaryUpdater.updateEntry(this, preferences,
                R.string.key_googlemaps_address_entry,
                R.string.prefs_setting_summary_address);
        SummaryUpdater.updateEntry(this, preferences,
                R.string.key_googlemaps_city_entry,
                R.string.prefs_setting_summary_city);
    }
长答案和更通用的辅助类方法:

public class SomePrefenceScreen extends PreferenceFragment implements
        OnSharedPreferenceChangeListener {

    private EditTextPreference edittext;

    private Context context;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        context = getActivity();
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.your_settings_xml);

        edittext = (EditTextPreference) getPreferenceScreen().findPreference("test");

    }

    @Override
    public void onStart() {
        updateAll();
        super.onStart();
    }

    @Override
    public void onResume() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .registerOnSharedPreferenceChangeListener(this);

        super.onResume();
    }

    @Override
    public void onPause() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .unregisterOnSharedPreferenceChangeListener(this);
        super.onPause();
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        updateAll();
    }

    private void updateAll() {
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);

        // test_key being the android:key defined in XML in your_settings_xml
        String titleString = sharedPrefs.getString("test_key", "");
        if (!titleString.isEmpty()) {
            edittext.setTitle(titleString);
        }

    }

}
public class GoogleMapsSettings extends DaggerPreferenceFragment implements
        OnSharedPreferenceChangeListener {

    private static final String TAG = "GoogleMapsSetings";

    private StatusCheck statusCheck;

    private ListPreference address_entry;
    private ListPreference city_entry;

    @Inject @ForActivity Context context;
    @Inject Preferences preferences;
    @Inject GoogleMapsModule googleMapsModule;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.settings_module_googlemaps);

        address_entry = (ListPreference) getPreferenceScreen().findPreference(
                getString(R.string.key_googlemaps_address_entry));

        city_entry = (ListPreference) getPreferenceScreen().findPreference(
                getString(R.string.key_googlemaps_city_entry));

    }

    @Override public void onStart() {
        updateAllSummaries();

        statusCheck = new StatusCheck(context, googleMapsModule, this);
        statusCheck.runCheck();
        super.onStart();
    }

    @Override public void onResume() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .registerOnSharedPreferenceChangeListener(this);

        super.onResume();
    }

    @Override public void onPause() {
        PreferenceManager.getDefaultSharedPreferences(context)
                .unregisterOnSharedPreferenceChangeListener(this);
        super.onPause();
    }

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

        if (key.equals(getString(R.string.key_module_activated_googlemaps))) {
            statusCheck.runCheck();
        }

        updateAllSummaries();
    }

    private void updateAllSummaries() {
        SummaryUpdater.updateEntry(this, preferences,
                R.string.key_googlemaps_address_entry,
                R.string.prefs_setting_summary_address);
        SummaryUpdater.updateEntry(this, preferences,
                R.string.key_googlemaps_city_entry,
                R.string.prefs_setting_summary_city);
    }
SummaryUpdater只是一个帮助类,用于更新相关文本,这有助于减少代码冗余:

public class SummaryUpdater {

    public static void updateString(PreferenceFragment pref,
            Preferences preferences, int resource) {
        updateString(pref, preferences, resource, "");
    }

    public static void updateString(PreferenceFragment pref,
            Preferences preferences, int resource, String postfix) {
        Preference preference = (Preference) pref.findPreference(pref
                .getString(resource));
        if (preference != null) {
            String summaryString = preferences.getString(resource);
            summaryString = (postfix.isEmpty()) ? summaryString : summaryString
                    + " " + postfix;

            if (!summaryString.isEmpty()) {
                preference.setSummary(summaryString);
            }
        }
    }

    public static void updateEntry(PreferenceFragment pref,
            Preferences preferences, int resourcekey, int resourcedefault) {
        Preference preference = pref
                .findPreference(pref.getString(resourcekey));
        if (preference != null) {
            int currentEntry = Integer.parseInt(preferences
                    .getString(resourcekey));

            if (currentEntry != 0) {
                preference.setSummary(pref.getString(R.string.entry) + ": "
                        + currentEntry);
            } else {
                preference.setSummary(pref.getString(resourcedefault));
            }
        }
    }

    public static void updateInt(PreferenceFragment pref,
            Preferences preferences, int resource) {
        updateInt(pref, preferences, resource, "");
    }

    public static void updateInt(PreferenceFragment pref,
            Preferences preferences, int resource, String postfix) {
        Preference preference = (Preference) pref.findPreference(pref
                .getString(resource));
        if (preference != null) {
            String summaryString = "" + preferences.getStringInt(resource);
            summaryString = (postfix.isEmpty()) ? summaryString : summaryString
                    + " " + postfix;
            preference.setSummary(summaryString);
        }
    }
}
Preferences对象仅访问SharedReferences的读/写,例如下面是获取/设置字符串值:

public void putString(int resource, String value) {
    String key = context.getString(resource);
    boolean success = sharedPrefs.edit().putString(key, value).commit();
}

public String getString(int resource) {
    String key = context.getString(resource);
    if (sharedPrefs != null && context.getString(resource) != null) {
        return sharedPrefs.getString(key, "");
    }
    return "";
}

据我所知,您只想在该特定首选项的标题中显示存储在preference中的值。所以试试这个:

public void handleTEST(){
    final EditTextPreference pref = (EditTextPreference) findPreference("test");
    pref.setTitle(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("test", "Default Title"));
    // Loads the title for the first time
    // Listens for change in value, and then changes the title if required.
    pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            pref.setText(newValue.toString());
            return false;
        }
    });
}

希望这有帮助:)

这是我读到的。更改共享首选项值的值时,是否希望首选项活动/片段中显示的文本相应更新?否则,请使用问题中的代码发布完整的类,以便为您想要的内容添加更多的上下文。我写道,当我单击“确定”按钮时,我想用输入值来设置edittextpreference标题。这是我的代码所做的,只是它更改摘要而不是标题,但这个想法是有效的。方法是在onSharedPreferenceChanged中捕获首选项值的更改,而不是处理每个PreferenceView的单击。如果您发布包含handleTEST()的完整类代码,我将尝试为您实现它。@cYrixmorten您的答案没有达到这一点,这就是它看起来无效的原因。请将其缩短为所需的代码段。这可能会有所帮助:只需将其从“单击侦听器”更改为“更改侦听器”。不,如果我单击“确定”按钮,则不会应用标题,但仅当我重新单击“编辑文本”时才适用。有一种方法类似于“onPositiveButtonClick”?当值更改时,将调用方法onPreferenceChange()。请稍等,如果您仍然无法回答,我将发布一个答案。我已更新了我的答案,以包含答案的较短版本。此答案正确、简单且切中要害,但我只需要指出,在多个不同设置下,这将产生多少冗余代码。因此,如果您需要在多个设置中使用此选项,我建议您在每个设置页面上使用一个共享首选项ChangeListener的解决方案,正如我在回答中尝试演示的那样。我同意,如果使用匿名内部类,则代码不能重复使用。所以,我只会使用一个匿名类,如果我绝对肯定我不会在任何地方再次使用它。谢谢你指出这一点。:)