【问题标题】:Can not access shared preferences data properly无法正确访问共享首选项数据
【发布时间】:2016-01-07 06:52:53
【问题描述】:

我正在尝试通过共享首选项将一个字符串发送到另一个活动。我想回调相同的活动。

我有多个活动,它们共同调用一个活动。所以我想确定从哪个公共活动被调用,并想回到调用它的同一个活动。

这是我在第一个活动中完成的:

    SharedPreferences mPrefs = getSharedPreferences("Type", 0);
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putString("gosend","1");
    editor.commit();

在第二个活动中

SharedPreferences mPrefs = getSharedPreferences("Type1", 0);
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putString("goride", "2");
    editor.commit();

共同活动

  useLocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            SharedPreferences mPrefs = getSharedPreferences("Type", 0);
            activityType = mPrefs.getString("gosend", "1");

            SharedPreferences mPrefs1 = getSharedPreferences("Type1",0);
            goride = mPrefs1.getString("goride","2");

            if(activityType.equals("1")) {

                intent = new Intent(ChooseFromMapActivity.this, GoSend.class);

                startActivity(intent);
            }

            if(goride.equals("2"))
            {
                intent = new Intent(ChooseFromMapActivity.this, GoRideActivity.class);

                startActivity(intent);
            }

        }
    });
}

现在,当我从第一个活动调用公共活动时,我不会返回到相同的活动,而是第二个活动被调用。

怎么了??

编辑

我试过了:还是不行

    useLocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            SharedPreferences mPrefs = getSharedPreferences("Type", 0);
            activityType = mPrefs.getString("gosend", "0");

         //   SharedPreferences mPrefs1 = getSharedPreferences("Type1",0);
          //  goride = mPrefs1.getString("goride","0");

            switch (activityType){

                case "0":
                intent = new Intent(ChooseFromMapActivity.this, GoSend.class);

                startActivity(intent);
                    break;
                case "1":

                intent = new Intent(ChooseFromMapActivity.this, GoRideActivity.class);

                startActivity(intent);
                    break;
            }

            }

【问题讨论】:

  • 你的两个if 语句被一个一个调用,这就是为什么第二个活动被调用...使用if else
  • 你可以使用 SharedPreferences mPrefs = getSharedPreferences("Type", 0); inb 所有活动。以及在常见的活动中使用 if else
  • 感谢您的回复.. 我使用 else if.. 这样我在第一次打电话时得到了第一个活动,但在第二个活动中我也得到了第一个活动。@ Sharp Edge跨度>
  • 谢谢你的回复。你能告诉我代码吗? @user3676184
  • 您在首选项中设置了 2 个键,goridegosendif-statements 都可能为真,您还有 TypeType1,我不确定它们是什么,但是您有两种不同的偏好吗?提示:使用intent extra string来传递SRC_ACTIVITY参数,所以在common Activity中你可以知道哪个activity叫做common。

标签: java android android-activity sharedpreferences


【解决方案1】:

您在编写两个文件时调用了相同的共享偏好

第一个活动的注释 -->> SharedPreferences.Editor editor = mPrefs.edit();

第二个活动的注释 -->> SharedPreferences mPrefs = getSharedPreferences("Type1", 0);

在你的共同活动中...... -->SharedPreferences mPrefs = getSharedPreferences("Type", 0); activityType = mPrefs.getString("gosend", "1");

        SharedPreferences mPrefs1 = getSharedPreferences("Type1",0);
        goride = mPrefs1.getString("goride","2");

您指的是与代码中相同的文件,但实际上,您试图做的是引用 2 个单独的共享偏好...

mPref & mPref1....

所以,你必须决定使用其中一个,而不是两个......

编辑 --->> 更新代码建议。

在您的活动 1 中

SharedPreferences mPrefs = getSharedPreferences("Type", 0);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("gosend","1");
editor.commit();

在您的活动 2 中

SharedPreferences mPrefs = getSharedPreferences("Type1", 0);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("gosend", "2");
editor.commit();

==>> 确保“gosend”值是您想要的值。您正在衡量对“gosend”所做的更改,因为在您的代码中,您想测试“gosend”值,并根据这些值打开不同的活动。

在你的共同活动中

useLocation.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        SharedPreferences mPrefs = getSharedPreferences("Type", 0);
        activityType = mPrefs.getString("gosend", "0");

     //   SharedPreferences mPrefs1 = getSharedPreferences("Type1",0);
      //  goride = mPrefs1.getString("goride","0");

        switch (activityType){

            case "0":
                intent = new Intent(ChooseFromMapActivity.this, GoSend.class);
                startActivity(intent);
                break;
            case "1":
                intent = new Intent(ChooseFromMapActivity.this, GoRideActivity.class);
                startActivity(intent);
                break;
        }

    }
}

** 祝你好运,希望对你有所帮助..

【讨论】:

  • 我不需要在每个活动中设置共享偏好吗?你能用代码告诉我有什么问题吗? @Chim Ly
  • 在您的情况下,我可以建议您对所有活动仅使用 1 个共享首选项文件,每次您想要获取值时都引用相同的共享首选项文件。是的,您需要在每个活动中声明共享偏好,请参阅,共享偏好保存在值对中,您可以将许多键值对放入其中,并根据需要检索它们。
  • 请仔细查看您的代码,您指的是“mPref”和“mPref1”,这意味着有两个不同的共享首选项文件,这就是问题所在。或者,您可能还希望将其作为不同的 java 类(选项)
  • 请参考编辑。我尝试使用单个 mpref 仍然不起作用
  • 当我从第一个调用时仍然得到第二个活动作为回报。
【解决方案2】:

在您的常见活动中尝试以下代码:

useLocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            SharedPreferences mPrefs = getSharedPreferences("Type", 0);
            activityType = mPrefs.getString("gosend", "0");

            SharedPreferences mPrefs1 = getSharedPreferences("Type1",0);
            goride = mPrefs1.getString("goride","0");

            if(activityType.equals("1")) {

                intent = new Intent(ChooseFromMapActivity.this, GoSend.class);

                startActivity(intent);
            }

            else if(goride.equals("2"))
            {
                intent = new Intent(ChooseFromMapActivity.this, GoRideActivity.class);

                startActivity(intent);
            }

        }
    });
}

让我知道您的问题是否已解决。您的默认值与所需值匹配,因此每次第一个 if 语句都会变为 true。

希望这会有所帮助。

【讨论】:

  • activity type 什么时候为 1,goride 什么时候为 2?
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多