我们如何控制Android同步适配器首选项?

我们如何控制Android同步适配器首选项?,android,android-activity,fatal-error,accountmanager,Android,Android Activity,Fatal Error,Accountmanager,。 我成功地用上面示例中的以下代码片段在常规设置中显示了一个条目(帐户设置) <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="General Settings" /> <PreferenceScreen android:key="account_settings"

。 我成功地用上面示例中的以下代码片段在常规设置中显示了一个条目(帐户设置)

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="General Settings" />
        <PreferenceScreen android:key="account_settings"
             android:title="Account Settings"  android:summary="Sync frequency, notifications, etc.">
             <intent android:action="fm.last.android.activity.Preferences.ACCOUNT_SETUP"
                 android:targetPackage="fm.last.android"
                 android:targetClass="fm.last.android.activity.Preferences" />
        </PreferenceScreen>
    </PreferenceCategory>
</PreferenceScreen>

代码在常规设置中为我生成了一个条目(帐户设置):

单击帐户设置后,我收到如下错误,设备不必要地重新启动

错误/AndroidRuntime(30057):android.util.AndroidRuntimeException:从活动上下文外部调用startActivity()需要标志_Activity_NEW_TASK标志。这真的是你想要的吗

我知道这个错误可以通过代码解决。由于“帐户设置”首选项是基于XML的代码,所以我遇到了这个错误

  • 有人能帮忙解决这个问题吗

  • 我们如何通过代码控制这些偏好


  • 上面在中提到的文件/资源不在独立包中:这是作者唯一忘记修改的东西,我想:您必须创建自己的首选项类。 这是我的班级:

    public class AccountPreferences extends PreferenceActivity {
    public static final String TAG = "AccountPreferences";
    private boolean shouldForceSync = false;
    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.i(TAG, "onCreate");
        addPreferencesFromResource(R.xml.preferences_resources);
    
    @Override
    public void onPause() {
        super.onPause();
        if (shouldForceSync) {
            AccountAuthenticatorService.resyncAccount(this);
        }
    }
    
    Preference.OnPreferenceChangeListener syncToggle = new Preference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            shouldForceSync = true;
            return true;
        }
    };
    
    这是首选项文件:preferences_resources.xml

        <PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/privacy_preferences">
    
        <CheckBoxPreference
            android:key="privacy_contacts"
            android:defaultValue="true"
            android:summary="@string/privacy_contacts_summary" android:title="@string/privacy_contacts_title"/>
    </PreferenceCategory>
    
    <PreferenceCategory android:title="@string/outgoing_preferences">
    
        <CheckBoxPreference
            android:key="allow_mail"
            android:defaultValue="true"
            android:summary="@string/allow_mail" android:title="@string/allow_mail_text"/>
    
    </PreferenceCategory>
    
    
    

    您必须修改这些文件,或者更深入地查看他上一个.fm项目中的文件


    希望这有帮助,祝你好运。

    我不会准确回答你的两个问题,但我通过以下三个步骤解决了这个问题:

  • 设置帐户首选项XML
  • 创建一个活动来管理首选项
  • 从“首选项编辑”意图中提取帐户信息
  • 设置帐户首选项XML 我使用的account_preferences.xml与SDK示例和c99 Last.fm应用程序中的account_preferences.xml非常相似。考虑下面的片段:

    
    
    鉴于此,以下是我发现的一些要点:(请注意,我是通过实验而不是通过任何特定的Android文档发现的——如果这个问题的未来读者有这些参考资料,最好将它们链接在一起。)

    • 此首选项屏幕的安卓:键必须为“帐户设置”,否则安卓将无法找到并显示您的首选项
    • 通过使用明确的意图并指定targetPackage和targetClass,android将直接启动您的活动,您无需担心意图过滤器
    • Android将当前所选帐户的Account对象存储在此Intent的Extras中,这在接收端非常重要,因此您可以知道您正在管理哪个帐户。下面将对此进行详细介绍
    创建首选项管理活动 接下来,我创建了一个活动来对应上面XML中指定的包和类。请注意,据我所知,活动的选择取决于您——最常见的是将android.preference.PreferenceActivity子类化,但我也直接将Activity子类化。标准活动开发指南适用于此处

    从“首选项编辑”意图中获取帐户 当您的活动启动时,您可以从Extras捆绑包(使用此.getIntent().getExtras())和键“Account”提取相应的Account对象。回想一下,这个意图将是您最初在首选项XML文件中指定的。(同样,我无法在上面找到doc,因此通过转储随我的意图传入的Extras捆绑包的内容来找到它。)一旦您拥有该帐户,使用SharedReferences、您的数据库或您喜欢的任何其他方法加载/保存该帐户的首选项应该很简单


    希望这会有所帮助……

    似乎很多人都在c99上使用这本很棒的教程,但没有多少人会走得更远——唉-