J'aimerais demander de l'aide : Dans mon application, je n'ai qu'une seule activité, une PreferenceActivity
(il n'en faut pas d'autres, il s'agit juste d'une simple application de synchronisation en arrière-plan, donc la fonction PrefsActivity
est le Main/Launcher). Après que l'utilisateur ait configuré ses préférences, il vérifie un checkBoxPreference
et qui démarre (ou arrête) un service. Au démarrage, un dialogue s'affiche. Mais voici le problème : si l'utilisateur appuie sur la touche retour (quitter l'activité), la relance, et essaie ensuite de vérifier la valeur de l'activité. checkBoxPref
., le prefsactivity
plantages. Le dialogue ne s'affiche pas. Je n'ai aucune idée de la raison et de la façon de la réparer.
Ce code est exactement le même que celui de cette partie, ce qui me pose problème :
PrefsActivity.java :
package is.it.works;
// imports .....
public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}// onCreate
@Override
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
if (key.equals("checkTest")) {
showDialog(1);
}
if (key.equals("cancel")) {
dismissDialog(1);
}
}// onSPC
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case 1: {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage("press back twice, start the app again, and click checkbox...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
prefs.edit().putBoolean("cancel", false).commit();
}
});
return dialog;
}// case
}// switch
return null;
}// onCreateDialog
}// PrefsActivity
prefs.xml :
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:key="checkTest" android:title="test" />
</PreferenceScreen>
et le manifeste :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="is.it.works" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".PrefsActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Erreur LogCat :
09-14 10:34:34.472: ERROR/AndroidRuntime(281): Uncaught handler: thread main exiting due to uncaught exception
09-14 10:34:34.502: ERROR/AndroidRuntime(281): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@43756de8 is not valid; is your activity running?
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.ViewRoot.setView(ViewRoot.java:456)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.Window$LocalWindowManager.addView(Window.java:409)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.Dialog.show(Dialog.java:238)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.Activity.showDialog(Activity.java:2413)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at is.it.works.PrefsActivity.onSharedPreferenceChanged(PrefsActivity.java:27)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.ApplicationContext$SharedPreferencesImpl$EditorImpl.commit(ApplicationContext.java:2727)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.tryCommit(Preference.java:1199)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.persistBoolean(Preference.java:1404)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.CheckBoxPreference.setChecked(CheckBoxPreference.java:155)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.CheckBoxPreference.onClick(CheckBoxPreference.java:143)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.performClick(Preference.java:811)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.ListView.performItemClick(ListView.java:3246)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Handler.handleCallback(Handler.java:587)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Handler.dispatchMessage(Handler.java:92)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Looper.loop(Looper.java:123)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.ActivityThread.main(ActivityThread.java:4203)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at java.lang.reflect.Method.invokeNative(Native Method)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at java.lang.reflect.Method.invoke(Method.java:521)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
09-14 10:34:34.502: ERROR/AndroidRuntime(281): at dalvik.system.NativeStart.main(Native Method)
09-14 10:34:34.522: INFO/Process(52): Sending signal. PID: 281 SIG: 3
09-14 10:34:34.532: INFO/dalvikvm(281): threadid=7: reacting to signal 3
09-14 10:34:34.592: INFO/dalvikvm(281): Wrote stack trace to '/data/anr/traces.txt'
09-14 10:34:38.533: DEBUG/dalvikvm(107): GC freed 437 objects / 21560 bytes in 136ms
09-14 10:34:39.183: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
09-14 10:34:44.632: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
09-14 10:34:47.412: INFO/Process(281): Sending signal. PID: 281 SIG: 9
09-14 10:34:47.472: INFO/ActivityManager(52): Process is.it.works (pid 281) has died.
09-14 10:34:47.492: INFO/WindowManager(52): WIN DEATH: Window{4394f638 is.it.works/is.it.works.PrefsActivity paused=false}
Après avoir beaucoup cherché sur Google, je pense que la mauvaise partie est le ProgressDialog dialog = new ProgressDialog(this);
. Cause this
des changements. Mais le changer en getApplicationContext()
o PrefsActivity.this
n'aide pas, le problème est toujours là. S'il vous plaît, dites-moi pourquoi cela se produit, et quelle pourrait être la solution ! Merci ! Je suis coincé, et maintenant je n'ai aucune idée...
4 votes
Utiliser getParent() à la place de ceci et essayer
4 votes
Vérifiez ce lien [BadTokenException ]( vinnysoft.blogspot.com/2010/11/ ). Cela vous aidera. Merci Venky.
1 votes
En utilisant getParent(), je reçois une NullpointerException. :(
0 votes
Merci pour la réponse, j'ai aussi trouvé cette page. Mais afficher le dialogue juste quand l'activité n'est pas terminée n'est pas la solution. L'activité est en cours d'exécution, après avoir appuyé sur back et recommencé. Le problème devrait être que (je pense) l'activité "change" (a changé "cette" référence), pas qu'elle est en train de se terminer.
0 votes
@Lama Est-ce que cela fonctionne maintenant après avoir changé cette référence ?
0 votes
Non, ça ne l'est pas. C'est là le problème. (mais je pense juste que la référence change, et que cela cause l'erreur, je ne suis pas sûr, c'est pourquoi je poste cette question)
0 votes
...et si ce cas est exact, je ne sais pas comment résoudre ce problème.
0 votes
Essayez de placer les messages de journal dans les méthodes du cycle de vie d'une activité. Vous verrez que si vous appuyez sur le bouton Retour, si vous êtes dans une activité, la méthode onDestroy doit être appelée. C'est la raison pour laquelle une exception se produit et vous devrez vérifier si l'activité est réellement terminée ou en cours d'exécution. Il y a une différence lorsque vous appuyez sur le bouton retour et le bouton d'accueil. Essayez avec les deux et voyez la différence.
0 votes
Duplicata possible de Impossible d'ajouter une fenêtre -- le jeton Android.os.BinderProxy n'est pas valide ; votre activité est-elle en cours d'exécution ?