gpt4 book ai didi

android - 从多个 Activity 中调用共享首选项,并访问其中一个中的按钮

转载 作者:行者123 更新时间:2023-11-29 22:07:56 28 4
gpt4 key购买 nike

我正在尝试实现从两个不同的 Activity 中调用的共享首选项。其中一个首选项是一个复选框,它隐藏或显示一个按钮,该按钮包含在其中一个 Activity 的 xml 布局文件中。

这个场景是使用:

public class MyPreferencesActivity extends PreferenceActivity
implements OnSharedPreferenceChangeListener { ... }

同样在 MyPreferencesActivity 类中,我有如下偏好更改代码:

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Button btnClear = (Button) findViewById(R.id.clearbuttonid);
if (prefs.getBoolean("Clear User Flag", true))
btnClear.setVisibility(View.VISIBLE);
else
btnClear.setVisibility(View.INVISIBLE);
}

preferences 类还有:

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

...使用 onPause() 类似地注销监听器。

正如所写的,我并不十分期望这段代码能够工作,因为 clearbuttonid 是在不同 Activity 的 xml 布局文件中定义的。如您所料,我在尝试访问 btnClear 时在共享首选项更改代码中遇到空指针异常。但奇怪的是它的其他一切都正常工作(?!)。也就是说,当我重新启动应用程序时,偏好复选框已更改,并且已执行相应的代码。

实际问题是:如何设置首选项代码以支持能够从两个不同 Activity 调用首选项并更改其中一个变量的简单目标?非常感谢。

EDIT>> 根据 Raju 的要求,这里是 logcat:

04-27 00:26:57.989: I/onSharedPreferenceChange(537): Shared preference changed
04-27 00:26:57.989: D/AndroidRuntime(537): Shutting down VM
04-27 00:26:57.989: W/dalvikvm(537): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-27 00:26:58.029: E/AndroidRuntime(537): FATAL EXCEPTION: main
04-27 00:26:58.029: E/AndroidRuntime(537): java.lang.NullPointerException
04-27 00:26:58.029: E/AndroidRuntime(537): at com.xyzzy.prototype.MyPreferencesActivity.onSharedPreferenceChanged(MyPreferencesActivity.java:49)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:455)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:365)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.tryCommit(Preference.java:1339)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.persistBoolean(Preference.java:1605)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:79)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.TwoStatePreference.onClick(TwoStatePreference.java:68)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.performClick(Preference.java:939)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:202)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView$1.run(AbsListView.java:3168)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Handler.handleCallback(Handler.java:605)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Handler.dispatchMessage(Handler.java:92)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Looper.loop(Looper.java:137)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.ActivityThread.main(ActivityThread.java:4424)
04-27 00:26:58.029: E/AndroidRuntime(537): at java.lang.reflect.Method.invokeNative(Native Method)
04-27 00:26:58.029: E/AndroidRuntime(537): at java.lang.reflect.Method.invoke(Method.java:511)
04-27 00:26:58.029: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-27 00:26:58.029: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-27 00:26:58.029: E/AndroidRuntime(537): at dalvik.system.NativeStart.main(Native Method)
04-27 00:26:58.599: I/dalvikvm(537): threadid=3: reacting to signal 3
04-27 00:26:58.618: I/dalvikvm(537): Wrote stack traces to '/data/anr/traces.txt'

最佳答案

The practical question is: how do I set up preferences code to support the simple goal of being able to call preferences from two different activities, and changing a variable in one of them? Many thanks.

如果我正确地解释了您的问题(并提供了代码 fragment ),您似乎正试图将 PreferenceActivity 中所做的更改“推送”到其他(可能正在运行的?) Activity 。如果情况确实如此,那么您可能已经倒退了。与其尝试插入偏好更改,不如从 Activity 中“拉取”它们的值。

换句话说,不要像现在这样编写代码:

if (prefs.getBoolean("Clear User Flag", true))
btnClear.setVisibility(View.VISIBLE);
else
btnClear.setVisibility(View.INVISIBLE);

正如您自己正确陈述的那样(并且根据经验建立),您无法访问不属于当前 Activity 的布局中的小部件,无论是“常规”布局还是 偏好 Activity 。您应该将首选项视为持久存储数据和应用程序状态的中央媒介。美妙之处在于您可以从任何地方访问首选项,只要您有一个 Context 引用。

因此,与其像上面那样尝试推送更改,您需要在 PreferenceActivity 中做的就是确保存储更改。完成后,您可以通过请求存储的值,从它所属的 Activity(或 Fragment)中简单地切换 btnClear 的可见性来自偏好:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean visible = prefs.getBoolean("Clear User Flag", true)
btnClear.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);

例如,您可以将它放在 ActivityonCreate(...) 中,但是如果您需要重新评估 中的可见性Activity 可能已经创建并在堆栈上,您可以简单地将它移动到例如onResume()

关于android - 从多个 Activity 中调用共享首选项,并访问其中一个中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344606/

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