【问题标题】:PreferenceActivity: using onSharedPreferenceChanged()PreferenceActivity:使用 onSharedPreferenceChanged()
【发布时间】:2012-03-15 12:19:27
【问题描述】:

所以基本上我有一个 PreferenceActivity,用于通过扩展 AsyncTask 的私有类调用 Web 服务。每当首选项更改时,我都会有一个“巨大的”“切换案例”来确定哪个首选项已更改,然后相应地进行调用。

现在我有两个问题:

  1. 这似乎是一种“愚蠢”的方式来处理我的问题。您对我应该怎么做有什么建议吗?
  2. 我刚刚创建了另一组包含 N 个 CheckboxPreferences 的首选项。在调用类 JoinQueueTask().execute(String queue_key) (JoinQueue extends AsyncTask) 方面,我该如何“处理”这些问题?

相关代码sn-p:

    public void onSharedPreferenceChanged(SharedPreferences arg0, String key) 
{
    if(isFirstRun)
        return;

    // Call Forward Preferences
    if(key.contentEquals("call_forward_always"))
    {
        cfInfo[0] = "1";
        cfInfo[1] = arg0.getString(key, "ERROR");
        new PushCallForwardInfoTask().execute(cfInfo);
        ep1.setSummary("Viderestiller til " + cfInfo[1]);
    }
    else if(key.contentEquals("call_forward_busy"))
    {
        cfInfo[2] = "1";
        cfInfo[3] = arg0.getString(key, "ERROR");
        new PushCallForwardInfoTask().execute(cfInfo);
        ep2.setSummary("Viderestiller til " + cfInfo[3]);
    }
    else if(key.contentEquals("call_forward_noresponse"))
    {
        cfInfo[4] = "1";
        cfInfo[5] = arg0.getString(key, "ERROR");
        new PushCallForwardInfoTask().execute(cfInfo);
        ep3.setSummary("Viderestiller til " + cfInfo[5]);
    }
    else if(key.contentEquals("call_forward_timeout"))
    {
        cfInfo[6] = arg0.getString(key, "ERROR");
        new PushCallForwardInfoTask().execute(cfInfo);
        ep4.setSummary("Viderestiller efter " + cfInfo[6] + " sekunder");
    }

    // Show Number Preferences
    else if(key.contentEquals("shownumber_list"))
    {
        String[] newnumber = {""}; 
        newnumber[0] = arg0.getString(key, "ERROR");
        new PushNumberTask().execute(newnumber);
        lp.setSummary(arg0.getString(key, "ERROR"));
    }

    // Voicemail Preferences
    else if(key.contentEquals("voicemail_checkbox"))
    {
        final Boolean[] vmStatus = { Boolean.FALSE };
        vmStatus[0] = cp.isChecked();
        new PushVoicemailStatus().execute(vmStatus);
    }   

}

【问题讨论】:

    标签: android preferenceactivity


    【解决方案1】:

    要回答您的第一个问题,如果您不想使用大的 switch/case 语句来处理,那么最好的办法是扩展您正在使用的首选项。例如,如果您使用大量复选框,只需扩展复选框首选项并将您的逻辑添加到覆盖的方法中。以我的经验,这减少了代码,并使逻辑非常容易遵循。如果您需要了解某些东西是如何工作的或需要“破解”某些东西,您可以在 grepcode.com 上查看原始来源。

    【讨论】:

    • 好的。您是否知道我目前的解决方案是否是不好的做法?
    • @litemode 嗯.. 我不会说这是不好的做法。 Android 很难处理这种情况,因为首选项更改通常是字符串(当 SDK 迁移到 JRE7 时,您可以切换字符串)。保持代码松散耦合是一种好习惯,我认为处理首选项中的首选项更改就是这样做的。这样,如果添加或删除首选项......它只会发生在一个地方。但在某些情况下,您正在做的事情是必要的,也是唯一可用的方法,您觉得自己很舒服,并且更容易阅读和维护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2013-12-29
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多