java - Android SharedPreferences 来自 fragment 中的 onclick

标签 java android sharedpreferences

我希望有人能给我一些指导,告诉我如何从 onViewCreated 事件中定义的按钮 onclick 事件中访问 SharedPreferences。

我可以通过调用以下方法在 onViewCreated 事件中设置界面的值:

SharedPreferences prefs = this.getActivity().getSharedPreferences(
    "com.example.app", Context.MODE_PRIVATE);

并获取适当的值,但我在界面上有一个按钮需要按下来保存更改,而且我似乎无法想出从按钮的单击事件中访问 SharedPreferences 的正确方法:

Button btn = (Button)view.findViewById(R.id.btnSave);
btn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Perform action on click
        Log.d("test","here");
        SharedPreferences prefs = this.getActivity().getSharedPreferences(
                "com.example.app", Context.MODE_PRIVATE);

    }
});

这段代码显然不起作用,因为这里 this 引用了 View ,而 getActivity 在 View 中不起作用。谁能告诉我如何从这里访问 Activity,以便我可以访问 SharedPreferences?

最佳答案

您好,欢迎来到 StackOverflow。

您无法访问 SharedPreferences 的原因是 this 不是 fragment :如果您仔细观察,您会发现您有 2 个嵌套上下文,因此 this 实际上是一个 OnClickListener 对象(位于 fragment 内部)。

当您需要访问“父上下文”时,您可以这样做:

 public class MyCoolFragment extends Fragment {

    // here "this" is in fact your Fragment,
    // so this.getActivity().getSharedPreferences() DOES exist

    .
    .
    .

    Button btn = (Button)findViewById(R.id.btnSave);
    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            // Perform action on click
            // "this" is NO LONGER your fragment, but the View.OnClickListener
            // to access the PARENT CONTEXT you prepend the CLASS NAME:

            // MyCoolFragment.this.getActivity().getSharedPreferences will work:


            SharedPreferences prefs = MyCoolFragment.this.getActivity().getSharedPreferences()
                    "com.example.app", Context.MODE_PRIVATE);

        }
    });

在 Java 中,具有深度嵌套的上下文是非常典型的,因此您必须告诉 Java 您想要什么 this

此外,请记住您可以轻松地从任何 View 获取上下文。,因此在点击处理程序中您还可以执行以下操作:

        Button btn = (Button)view.findViewById(R.id.btnSave);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
                Activity myActivity=(Activity)(v.getContext()); // all views have a reference to their context
                SharedPreferences prefs =myActivity.getSharedPreferences(
                        "com.example.app", Context.MODE_PRIVATE);

            }
        });

希望对你有帮助!

关于java - Android SharedPreferences 来自 fragment 中的 onclick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623681/

相关文章:

java - 循环打印并计数

java - 通过 REST 登录 SugarCRM 无效

java - 如何统计Firestore中某个集合下的文档数量?

java - 调用 onResponse 时应用程序崩溃

android - SharedPreferences 保存按钮更改后不可见单击它并让出现另一个按钮

java - 如何通过共享首选项保存菜单项可见性状态?

java - Java 中使用 XADES-EPES 进行 XML 签名有一个很好的示例吗?

java - 获取当前类文件路径上方两个目录的路径

android - 找不到处理 Intent 的 Activity { act=android.intent.action.PICK dat=content ://media/external/images/media }

java - android java 检索数组列表中的共享首选项