3

これまでのところ、多くのスタックオーバーフローの提案を確認して試すなど、Android の設定と戦っておそらく 6 時間記録しました。私の最近の問題は、設定アクティビティから行った変更がメインのアクティビティに引き継がれないことです。コードを抽出しました。

主な活動:

public class MainActivity extends Activity {

    /*...*/

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*...*/
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())
        {
        case R.id.menu_settings:
            startActivity(new Intent(this, PrefsActivity.class));
            return true;
        }
        return false;
    }

    @Override
    public void onStart()
    {
        super.onStart();

        SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE);
        int somePrefValue = prefs.getInt("somePrefKey", 1);
        /*...*/
    }
}

設定アクティビティ:

public class PrefsActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.app_prefs);
    }
}

設定リソース:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="Some Category">

        <EditTextPreference
            android:key="somePrefKey"
            android:title="Some Preference"
            android:defaultValue="1"
            android:numeric="integer" /> 

    </PreferenceCategory>

</PreferenceScreen>

問題が発生した場合、エミュレータと Nexus 7 の両方で 4.1 でこの問題が発生しています。

<VENT>記録のために、これまでに私が戦った(そして勝った)好みで戦った戦いを以下に示します。

  1. XML 設定ファイルが Eclipse ツリー内のどこに置かれ、何と呼ばれるか。
  2. 設定アクティビティで値を整数または浮動小数点数に制限する方法。
  3. XML で設定値を整数または浮動小数点として指定しても、設定が整数または浮動小数点数になるわけではなく、文字列のままです。
  4. 共有設定ファイルの名前を取得するいくつかのメソッドにもかかわらず、実際にファイルをロードする唯一のメソッドは addPreferencesFromResource() であり、PreferenceActivity からのみです。XML を解析しない限り、XML と最初の prefs ゲッターでデフォルトを重複してコーディングする必要があります。

設定に関する Android の公式ドキュメントを読んだり、3 冊の本で設定の使用に関する章を読んだりしたにもかかわらず、私はこれらの問題を抱えていました。Android のドキュメントは概してかなり優れていますが、私の (継続的な) トラブルと、これに関する膨大な数のスタックオーバーフローの質問を考慮すると、この部分には多少の作業が必要だと思います。</VENT>

私の最近の問題についてご協力いただきありがとうございます。

PS 非フラグメント アプローチが非推奨になったことは認識していますが、私は Android を初めて使用し、Nexus 7 タブレット以外で実行する必要のないプロトタイプを作成する期限が迫っています。シンプルにしたいのですが、今は時間を節約していないように見えます.

4

2 に答える 2

3

メイン アクティビティでデフォルト以外の SharedPreferences を使用しているようです"app_prefs"が、PreferenceActivity はこれを参照しておらず、おそらくデフォルトの SharedPreferences に保存しています。

次のいずれかを行う必要があります。

  1. 名前付きのアクティビティの代わりに、Main アクティビティでデフォルトの SharedPreferences を使用します (また、louielouie の提案に従って onResume に移動します)。

    @Override
    public void onResume()
    {
        super.onResume();
    
        SharedPreferences prefs = 
           PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    
        int somePrefValue = Integer.valueOf(prefs.getString("somePrefKey", "1"));
        /*...*/
    }
    

    また

  2. 使用する SharedPreferences の名前を PreferenceActivity に伝えます。

    public class PrefsActivity extends PreferenceActivity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getPreferenceManager().setSharedPreferencesName("app_prefs"); //ADD ME
            addPreferencesFromResource(R.xml.app_prefs);
        }
    }
    
于 2012-10-12T20:58:00.077 に答える
2

そのコード スニペットの問題は、onStart を使用していることだと思います。これは、PrefsActivity に移動してから MainActivity に戻ったときに呼び出されない可能性があります。代わりに、次のように onResume() を使用します。

@Override
public void onResume()
{
    super.onResume();

    SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE);
    int somePrefValue = prefs.getInt("somePrefKey", 1);
    /*...*/
}

MainActivity に戻ると、必ず onResume が呼び出されます。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleのライフサイクル図は、これをよく示しています。

于 2012-10-12T20:46:14.800 に答える