【问题标题】:Concatenating Two Values From Shared Preferences连接来自共享首选项的两个值
【发布时间】:2017-11-28 00:00:18
【问题描述】:

想出这个有点麻烦。我在Config 类中存储了两个值作为共享首选项、一个电子邮件地址和一个 URL。这会将 JSON 从我的服务器解析为 ListView。我正在尝试将它们连接在一起,但它不起作用。

Config.java

public class Config {

    //URL to JSON API
    public static final String GET_ORDERS_URL = "http://192.568.8.245/android/json3.php?user_email=";

    //Storing current user
    public static final String EMAIL_SHARED_PREF = "user_email";

}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Concatenated URL to JSON API
        private static final String baseurl = Config.GET_ORDERS_URL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Fetching email from shared preferences
        SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
        String user_email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");

        //Concatenated JSON API URL
        String url = baseurl + user_email;

        //Initializing Toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_back);
        toolbar.setTitle(user_email);
}

我知道user_email 正在被存储,因为我在MainActivity 中调用它并用它设置我的工具栏的标题。用实际的电子邮件替换 user_email 会成功,显然我不想这样做。知道我需要做什么吗?

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    使用 android UrlEncoder 类来制作正确的 url

    这是最好的方法。 使用手动连接可能会导致请求格式错误。

    你也可以像这样构建 URI

    String uri = Uri.parse("http://...")
                    .buildUpon()
                    .appendQueryParameter("key", "val")
                    .build().toString();
    

    【讨论】:

    • 好的,过去几个小时我一直在研究这个问题,尝试按照您的建议使用 URI 构建器,但仍然没有结果。我是正确构建它还是我的语法错误?我已经编辑了我的原始代码。
    • 好的,我终于在 5 小时后完成了这项工作。我尝试使用 URI 构建器并且仍然想要,所以任何更多的提示都会很棒。与此同时,我使用了类似于 Henry 建议的解决方案,并更新了代码以反映更改。
    • 当然,你帮我弄清楚了,我选择了Uri.Builder builder = new Uri.Builder(); 等等...
    【解决方案2】:

    获取值并调用 concatStrings(str1,str2);
    使用类似的东西

    String concatStrings(String string1,String string2){
        StringBuilder strBuilder=new StringBuilder();
        strBuilder.append(string1);
        strBuilder.append(string2);
        return  strBuilder.toString();
    }
    

    【讨论】:

    • 这比更简单的string1 + string2 好在哪里?
    • 我根据我的个人经验给了你这个答案,因为有时在向服务器发送一些数据时,它有时会添加未知的、不可见的符号,我没有得到想要的输出。但是使用 StringBuilder 总是给我想要的输出。如果您的任何字符串中有转义字符,它也会有所帮助。
    • 嗯,实际上它完全一样。我不清楚您是如何得出存在差异的结论的。
    • 这取决于您的使用方式以及字符串中的内容。这就是我分享的代码,也许你得到了正确的答案,但我没有。你可以如果这对您没有帮助,请忽略我的回答
    【解决方案3】:

    注意:OP 已将此答案应用于其问题中的代码。它适用于问题的第 1 版。

    连接正在工作并产生字符串:

    "http://192.568.8.245/android/json3.php?user_email=user_email"
    

    因为您连接的是共享首选项键,而不是值。

    您希望与从共享首选项中检索到的值连接

    String user_email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF);
    String url = Config.GET_ORDERS_URL + user_email;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多