gpt4 book ai didi

android - PreferenceFragment OnPreferenceClickListener() 只工作一次

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:45:04 28 4
gpt4 key购买 nike

我正在实现一个自定义的 Preference,其行为类似于按钮(该首选项将打开一个对话框以恢复所有首选项的默认值)。如果您单击对话框显示的 ResetPreference 并在肯定的单击上清除并重置所有首选项数据,它工作正常,但是 如果您单击 ResetPreference 再次没有任何反应。我想在将 PreferenceScreen 设置为 null 并重新添加资源时,有些地方不对劲。

如果你问我为什么使用这种方法,我想点击重置并直接显示更改的结果,如果有人知道实现重置的更好方法请举个例子。

PS:如果单击 ResetPreference 并选择否定按钮,则不会发生任何事情,并且监听器仍然可以正常工作,因此它确实应该与删除和重新添加资源有关。

ResetPreference.java

public class ResetPreference extends Preference {

public ResetPreference(Context context, AttributeSet attrs) {
super(context, attrs);

setOnPreferenceClickListener(new OnPreferenceClickListener() {

public boolean onPreferenceClick(Preference preference) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
SettingsFragment.resetSettings(getContext());
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();

return false;
}
});

}}

然后是我自定义的PreferenceFragmentSettingsFragment.java

public class SettingsFragment extends PreferenceFragment{

private static SettingsFragment sf = null;

public static void resetSettings(Context ctx)
{

PreferenceManager
.getDefaultSharedPreferences(ctx)
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);

if(sf != null)
{
sf.setPreferenceScreen(null);
sf.addPreferencesFromResource(R.xml.preferences);
}
}

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

sf = this;

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

Preference reset = (Preference) findPreference("reset");

reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference pref)
{

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
PreferenceManager
.getDefaultSharedPreferences(getActivity().getApplicationContext())
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(getActivity().getApplicationContext(), R.xml.preferences, true);

setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();


return true;
}
});
}

@Override
public void onStop() {
super.onStop();
sf = null;
}}

添加来自https://stackoverflow.com/a/24648780/3387852的建议后一切都在 SettingsFragment 中完成。不再需要 ResetPreference,可以使用标准的 android Preference

实现重置按钮所需的唯一代码在此更新中

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment{

private void addMyResetListener() {
Preference reset = (Preference) findPreference("reset");

reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference pref)
{

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
resetSettings(SettingsFragment.this.getActivity());
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();

return true;
}
});
}

public void resetSettings(Context ctx)
{
//Remove all Settings
PreferenceManager
.getDefaultSharedPreferences(ctx)
.edit()
.clear()
.commit();
//All Settings that are empty will be loaded from default values again
PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);

setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();
}

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

// Load the preferences from an XML resource & add listener
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();
} }

最佳答案

当您调用 setPreferenceScreen(null); 时,屏幕的所有数据和监听器都将被删除。然后通过调用 addPreferencesFromResource(R.xml.preferences); 添加数据但不添加监听器。

因此,要使 Preference 重置为正常工作,您需要再次添加监听器!

我建议你创建一个方法

private void addMyResetListener() {
Preference reset = (Preference) findPreference("reset");

reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference pref)
{

resetSettings(SettingsFragment.this.getActivity());


return true;
}
});
}

然后在

之后使用它
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();

所以resetSettings变为

 public void resetSettings(Context ctx) // also removed static
{

PreferenceManager
.getDefaultSharedPreferences(ctx)
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);

setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();
}

这样你就不需要自定义首选项 ResetPreference

关于android - PreferenceFragment OnPreferenceClickListener() 只工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24648628/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com