7

カスタム Android 同期アダプターを作成しようとして、私はこれに従いました。上記の例の次のコード スニペットを使用して、一般設定でエントリ (アカウント設定) を表示することに成功しました。

<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>

このコードにより、一般設定にエントリ ( Account Settings ) が表示されました。

[アカウント設定]をクリックすると、次のようなエラーが表示され、デバイスが不必要に再起動します。

エラー/AndroidRuntime(30057): android.util.AndroidRuntimeException: アクティビティ コンテキストの外部から startActivity() を呼び出すには、FLAG_ACTIVITY_NEW_TASK フラグが必要です。これは本当にあなたが望むものですか?

このエラーはコードで解決できることを知っています。「アカウント設定」設定は XML ベースのコードであるため、エラーが発生します。

  1. 誰でも問題の解決を手伝ってもらえますか?

  2. この種の設定をコードでどのように制御するのでしょうか?

4

2 に答える 2

7

2 つの質問には正確にはお答えできませんが、次の 3 つの手順を使用してこの問題に対処しました。

  1. アカウント設定 XML のセットアップ
  2. 設定を管理するアクティビティを作成する
  3. 「設定編集」インテントからアカウント情報を抽出する

アカウント設定 XML のセットアップ

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 ドキュメントではなく、実験を通じてこれらを見つけたことに注意してください。それらをリンクします。)

  • この PreferenceScreen の android:key は「account_settings」でなければなりません。そうしないと、Android は設定を見つけて表示しません
  • 明示的なインテントを使用し、targetPackage と targetClass を指定することで、android はアクティビティを直接開始し、インテント フィルターについて心配する必要はありません。
  • Android は、現在選択されているアカウントの Account オブジェクトをこの Intent's Extras に保存します。これは、受信側で非常に重要であるため、管理しているアカウントを知ることができます。これについては、以下で詳しく説明します。

環境設定管理アクティビティの作成

次に、上記の XML で指定されたパッケージとクラスに対応するアクティビティを作成しました。私が知る限り、Activity の選択はあなた次第です。android.preference.PreferenceActivity をサブクラス化するのが最も一般的ですが、Activity も直接サブクラス化しました。標準のアクティビティ開発ガイドラインがここに適用されます...

「設定編集」インテントからアカウントを取得する

アクティビティが起動すると、対応する Account オブジェクトを Extras Bundle から (this.getIntent().getExtras() を使用して) 抽出し、キー「account」を取得できます。このインテントは、設定 XML ファイルで最初に指定したものになることを思い出してください。(繰り返しますが、これに関するドキュメントが見つからなかったので、Intent で渡された Extras Bundle のコンテンツをダンプして見つけました。) アカウントを取得したら、SharedPreferences を使用してそのアカウントの設定をロード/保存するのは簡単です。データベース、または好みの他の方法。

それが役立つことを願っています...

于 2011-06-02T17:33:13.017 に答える
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 プロジェクトのファイルを詳しく調べる必要があります。

これが役に立てば幸いです。幸運を祈ります。

于 2011-04-05T21:15:04.220 に答える