14

編集: 以下で説明する問題は、コーディング関連の問題が原因ではない、非常に特殊なデバイスの問題が原因でした。

多くのcheckBoxPreferencesがあるpreferenceActivityがあります。checkBoxPreferenceは、デフォルトの共有設定ファイルを保存し、UIを更新するためにアプリを開いたときに再度呼び出されることを想定しています。

これは、想定されているようには起こりません。アプリを閉じて元に戻すと、値は想定どおりのままになりますが、タスクマネージャーを使用してアプリを終了したり、電話の電源を入れ直したりすると(アプリが実行されていない場合)、defaultValuesが呼び出されます。また。

そこで、onResume()でSharedPreferenceを作成してテストしました。

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

次に、その共有設定にキーがあるかどうかを確認します。

pref.contains("myCheckBoxPreference");

閉じて開いて元に戻すと、trueが返されます。タスクマネージャーを閉じたり、電話の電源を入れ直したりすると、falseが返されます。

そこで、SharedPreferenceを手動で設定してみました

SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();

そして、checkboxpreferenceの値が変わったときにそれを呼び出しました。また、onStopとonPauseで呼び出してみました。それでも、アプリを閉じて再度開くと、pref.containsはtrueを返しますが、電話の電源を入れ直してから再びオンにすると、falseを返します。

そこで、SharedPreferencesファイルを使用してみました。

クラス宣言では:

public static final String PREFS = "prefs";

そしてonResume()で:

SharedPreferences pref = this.getSharedPreferences(PREFS, 0);

同じ動作で、pref.containsは、アプリを閉じて再度開くとtrueを返しますが、電話の電源をオフにしてから再度オンにするとfalseを返します。

次に、myCheckBoxPreferenceのキー値をCheckBoxPreferenceのxmlキーと一致しないものに変更しようとしましたが、それでも同じ効果がありました。

そして、電話からアプリケーションをアンインストールし、電話の電源をオフにしてから再度オンにしてから再インストールしましたが、それでも同じ効果があります。

4

7 に答える 7

7

私はちょうどそれを解決しました、私はかなり確信しています。私の側ではコードエラーはなく、私のアプリにも問題はありません(とにかく、私は信じていません)。

「testproj」という新しいプロジェクトを作成し、設定PreferenceActivityからすべてのコードをコピーしてTestprojActivityに貼り付け、依存しているxmlからコードをコピーしてから、TestProjのmain.xmlに貼り付けました。

次に、Samsung CaptivateにTestProjをインストールし、設定を変更し、RAM管理(私が持っているカスタムROMの機能)を介してRAMをクリアしましたが、設定がスタックしました。次に、電話の電源を入れ直しましたが、設定は構成したとおりに残っていました。

私が手動でそれらを使用してそれらを設定したとき、それらは両方にとどまりました:

PreferenceManager.getDefaultSharedPreferences();

手動でSharedPreferencesに保存する必要はありません。

それは私の電話ではないので、まだ試していませんが、データの初期化で完全に修正されると 思います編集:新しいSamsungCaptivateとSamsunginfuseの両方でテストでき、動作しました。

私はこれを理解しようとして多くの時間を無駄にしました、そしてそれが他の誰かに役立つことを願っています。:)

于 2011-07-01T23:19:30.000 に答える
6

サムスンギャラクシーSで同様の問題が発生した可能性があります。この問題では、設定XMLファイルのアクセス許可が何らかの理由で変更/破損しています。

ログには、一部のホストプロセスがファイルの読み取りに失敗し、すべての設定がデフォルトにリセットされていることが明らかになりました。正確なエラーメッセージは思い出せませんが、「/path/to/preferences/file.xmlの許可が拒否されました」という行に沿っていました。

私の解決策は、[設定]、[アプリケーション]、[アプリケーションの管理]、[MyApp]、[データの削除]からアプリケーションデータを削除することでした。これにより、アプリに関連付けられている設定ファイルが削除され、問題はすぐに解消されました。

さまざまなAndroidデバイス(Galaxy S IIを含む)で再び発生したことはないため、これは孤立したイベントであると想定しました。

于 2011-07-01T23:26:34.200 に答える
3

クライアントのメインテストデバイスで、まったく同じ問題が発生しました。使用するデバイスは、SDKレベル8(2.2.1)のSamsungGalaxySです。

奇妙な動作は、SharedPreferences保存されないか、工場出荷時のリセット後のように永続的すぎる、つまり、アプリケーションを再インストールした後に削除されないことです。

現在の2.2.xの配布と、販売されたSamsung Galaxy Sデバイスの数が数百万であるため、この問題が発生する可能性は非常に高くなります。

したがって、設定を保存するための回避策を実装することが重要であると見なすことができます。

この回避策を鋭利な方法で分離するための詳細な特性を収集するために、この問題に直面しているすべての人が、対応するカーネルバージョンSystem.getProperty("os.version")をここに提供できますか?

私はこのようなことを考えていました:

// !! I know that 2.6.32.9 is not yet correct. This would be a false positive !!
if ((System.getProperty("os.version").startsWith("2.6.32.9"))
    && (android.os.Build.DEVICE.contains("GT-I9000")))
    useInternalStorage();
else
    useSharedPreferences();

準備ができて誰かが興味を持ったら、ここに実際のコードを投稿することもできます。


編集:いくつかの追加情報:

その問題に直面しているデバイス:

    プロパティ| 値
    --------------------------------- + ---------------- --------------------
    Build.DEVICE | 「GT-I9000T」
    Build.VERSION.INCREMENTAL | 「UBJP9」
    Build.VERSION.RELEASE | 「2.2.1」
    Build.VERSION.SDK | 8
    System.getProperty( "os.version")| 「2.6.32.9」
    

その問題に直面していない同様のデバイス:

    プロパティ| 値
    --------------------------------- + ---------------- --------------------
    Build.DEVICE | 「GT-I9000」
    Build.VERSION.INCREMENTAL | 「AOJP4」
    Build.VERSION.RELEASE | 「2.2」
    Build.VERSION.SDK | 8
    System.getProperty( "os.version")| 「2.6.32.9」
    

于 2011-09-26T12:16:53.560 に答える
3

値を設定する前に、エディターをクリアしてみてください。私は同じ問題を抱えていました、そしてそれは私のために働きました。例:

Editor e = PreferenceManager.getDefaultSharedPreferences(getParent()).edit();
e.clear();
e.putStringSet(key, value);
于 2013-09-22T21:35:22.203 に答える
0

署名されたアプリのいずれでも同じである必要があるsharedUserIdを使用して、権限の問題を回避することができます。

http://developer.android.com/reference/android/R.attr.html#sharedUserId

于 2011-11-09T18:01:19.530 に答える
0

私もデータの保存と取得に問題がありました。データの単一インスタンスが必要だったため、Applicationを拡張するクラスにSaveandLoadコードがありました。文字列が保存され、LogCatにエラーがないことを確認できましたが、それを読み込もうとすると、エラーなしで文字列が空になります。データが実際にファイルに入ったかどうかを確認したことがないので、保存またはロード、あるいはその両方で失敗したかどうかはわかりません。

私のコードは多かれ少なかれ次のとおりでした:(comboToSaveは単純なデータクラスからGsonによって生成された単純な文字列です)

保存する1つの方法:

  SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE); 
  SharedPreferences.Editor editor = sharedPref.edit();
  editor.putString(getString(R.string.prefCombos), comboToSave); 
  editor.commit();

ロードする別の方法で:

  SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
  String loadedComboText = sharedPref.getString(getString(R.string.prefCombos), "");

頭を悩ませて何をすべきかわからなかった後、sharedPref値を取得するコードを変更しました

SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

2つの違いについてはもう少しあります(私の場合はまったく同じように見えますが)

それでも私のGalaxyS3での結果は同じでした。ただし、VD(仮想デバイス)を含む他のデバイスで両方のバージョンをテストすることはできました。

コードの最初のバージョンでは、呼び出し元のアクティビティからアクティビティを渡しました。データの最後のビットがユーザーから収集されるアクティビティから保存するため、およびアプリの起動時に準備ができるようにメインアクティビティからロードするため。

私はアプリのインストールを解除して再インストールし、昨夜デバイスの電源をオフにしてから再びオンにして、無駄に遊んだ。

これで、saveメソッドとloadメソッドをアプリケーションクラスから入力を完了するアクティビティに移動しました。つまり、loadコードとsaveコードの両方が同じアクティビティに含まれるようになりました。私はこれを両方のコードのバリエーションでテストしましたが、どちらも機能します。保存したものを取り戻します。次に、すべてのコードをApplicationクラスに戻しましたが、機能します。これは私がどういうわけかすべてのインストール/アンインストールで私がどういうわけかそれを機能させることができたと信じるようになります。 ポイントは:コードが正しい-それが機能しない場合、デバイスや設定が原因である可能性があります

于 2013-07-16T11:35:53.677 に答える
0

私は同じ問題を抱えています、そして私はしばらくの間それに苦しみました、最終的に私は解決策を見つけました、そしてそれはとても簡単です、ただ活動の直接参照を渡すだけで、そして一般的な文脈を使用しません

public SessionManagment(Activity mContextActivity){
//  this.contextActivity = mContext;
    sharedPrefSession =  mContextActivity.getSharedPreferences(
            Constants.SHARED_PREFERANCES_LIGHT_TIGER_SESSION_FILE_NAME, 
            Context.MODE_PRIVATE);

}//enden constructor 

上記のコードは、セッション管理用に作成したクラスのコンストラクターであり、AsyncTaskのメインActivityFramgmentのコードで呼び出すと、次のように呼び出されます。

SessionManagment sessionManagment = new SessionManagment(referanct2thisActivity);

ここで、referanct2thisActivityは、このようなフラグメントアクティビティの「onCreate」関数で定義されています。

referanct2thisActivity = this;

それが将来他の人を助けることを願っています

于 2013-08-22T07:51:41.910 に答える