In an attempt to write a custom Android sync adapter I followed this。 我成功地在常规设置中显示了一个条目(帐户设置),并使用上面示例中的以下代码段。
<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>
代码在常规设置中为我输入了一个条目(帐户设置):
点击帐户设置后,我收到如下错误,设备会不必要地重新启动。
ERROR / AndroidRuntime(30057):android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?
我知道这个错误可以通过代码解决。由于“帐户设置”首选项是基于XML的代码,因此我遇到了错误。
任何人都可以帮忙解决问题吗?
我们如何通过代码控制这些偏好?
答案 0 :(得分:7)
我不会完全回答你的2个问题,但我通过以下3个步骤解决了这个问题:
我使用了一个与SDK示例和c99 Last.fm应用程序非常类似的account_preferences.xml。请考虑以下代码段:
<PreferenceScreen
android:key="account_settings"
android:title="Account Preferences"
android:summary="Misc account preferences">
<intent
android:action="some.unique.action.name.account.EDIT"
android:targetPackage="com.example.preferences"
android:targetClass="com.example.preferences.PreferencesActivity">
</intent>
</PreferenceScreen>
鉴于此,以下是我发现的一些重要观点:(请注意,我通过实验找到了这些,而不是通过任何特定的Android文档 - 如果这个问题的未来读者有这些参考,那就是很高兴把它们联系起来。)
接下来,我创建了一个Activity,以对应上面XML中指定的包和类。请注意,据我所知,Activity的选择取决于你 - 最常见的是子类android.preference.PreferenceActivity,但我也直接将子类化为Activity。标准活动开发指南适用于此处......
当您的Activity启动时,您可以从Extras Bundle(使用this.getIntent()。getExtras())和键“account”中提取相应的Account对象。回想一下,此Intent将是您最初在首选项XML文件中指定的Intent。 (再一次,我找不到这方面的文档,所以通过转储我的Intent传入的Extras Bundle的内容找到它。)一旦你有了帐户,使用SharedPreferences加载/保存该帐户的首选项应该很简单,数据库,或您喜欢的任何其他方法。
希望有帮助...
答案 1 :(得分:3)
上面提到的文件/资源不在独立软件包中:这是作者唯一忘记改编的东西我想:你必须创建自己的偏好类。 这是我的班级:
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>
你必须对它们进行调整,或者深入了解他的last.fm项目中的文件。
希望这会有所帮助,祝你好运。