L'android PopupWindow peut-il afficher un autre PopupWindow?

L'android PopupWindow peut-il afficher un autre PopupWindow? Combien de PopupWindow peut-on ouvrir en même temps? Seulement un?

Le premier PopupWindow s'affiche normalement. Mais sur le clic de bouton (qui se trouve dans la première vue de contenu de PopupWindow), j'ai une exception:

  • Impossible de connecter Nexus One Phone à Android adb
  • Android Studio ne peut pas s'authentifier avec SVN
  • Insertion de valeurs dans la table SQLite dans Android
  • Run-as: Impossible de définir les fonctionnalités: opération non autorisée
  • Aide à passer ArrayList et Partable Activity
  • Comment répéter une tâche après un certain temps dans Android?
  • 08-13 16:28:38.682: ERROR/AndroidRuntime(11760): FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@41286250 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:600) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:313) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) at android.view.Window$LocalWindowManager.addView(Window.java:537) at android.widget.PopupWindow.invokePopup(PopupWindow.java:992) at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:901) at org.example.qberticus.quickactions.BetterPopupWindow.showLikePopDownMenu(BetterPopupWindow.java:159) at org.example.qberticus.quickactions.BetterPopupWindow.showLikePopDownMenu(BetterPopupWindow.java:129) at name.antonsmirnov.android.popup.ui.MainActivity$1$1.run(MainActivity.java:44) at android.app.Activity.runOnUiThread(Activity.java:4170) at name.antonsmirnov.android.popup.ui.MainActivity$1.onClick(MainActivity.java:42) at android.view.View.performClick(View.java:3558) at android.view.View$PerformClick.run(View.java:14157) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4514) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method) 

    Le code est:

      @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bindControls(); initControls(); } private Button button; private void bindControls() { button = (Button) findViewById(R.id.button); } private void initControls() { initButton(button); } private void initButton(final Button button) { button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { final BetterPopupWindow window = new BetterPopupWindow(button); View popupview = createPopupView(); window.setContentView(popupview); runOnUiThread(new Runnable() { public void run() { window.showLikePopDownMenu(); } }); } }); } private View createPopupView() { View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.window, null); Button popupButton = (Button) v.findViewById(R.id.popupbutton); initButton(popupButton); return v; } 

  • Comment mettre à jour ListView en cas d'utilisation CursorAdapter?
  • Emulateur Android: impossible d'obtenir l'erreur wglGetExtensionsStringARB
  • Écoute des mots-clés en tout temps, comme "Ok google" sur 4.4
  • Populating Android Spinner avec la liste des objets
  • GetClass () dans la classe abstraite donne un appel de méthode ambigu
  • Comment rediriger d'une activité vers une autre activité
  • 3 Solutions collect form web for “L'android PopupWindow peut-il afficher un autre PopupWindow?”

    Après avoir joué avec ça, j'ai trouvé que

      window.showAtLocation(getWindow().getDecorView(), Gravity.CENTER, x, y); 

    Ça marche, mais

      window.showAsDropDown(getWindow().getDecorView(), Gravity.CENTER, x, y); 

    Soulève une exception! Si vous utilisez showAtLocation(view) avec une vue différente de getWindow().getDecorView() vous avez encore une exception.

    Oui, c'est possible, mais ce n'est pas recommandé. Il existe un moyen de le faire, mais cela ne fonctionne pas sur Android 2.1 ou moins. Voici un exemple de code:

     public class AlertDialogWithDialog extends AlertDialog implements OnClickListener { private boolean dirtyHackOnBackPressed = true; protected AlertDialogWithDialog(Context context) { super(context); setButton(BUTTON_POSITIVE, "OK", this); setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && dirtyHackOnBackPressed) { if(dirtyHackOnBackPressed){ DialogUtils dialogUtils = new DialogUtils(getContext(), AlertDialogWithDialog.this); DialogUtils.createDialog(); dirtyHackOnBackPressed = false; } return true; } else { dirtyHackOnBackPressed = true; return false; } } }); } @Override public void show() { super.show(); final Button cancelButton = getButton(DialogInterface.BUTTON_NEGATIVE); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DialogUtils dialogUtils = new DialogUtils(getContext(), AlertDialogWithDialog.this); dialogUtils.createDialog(); } }); } @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } } 

    Et la classe Utils:

     package com.example.utils; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.widget.Toast; /** * * @author Piotr Slesarew * */ public class DialogUtils { private String title = "..."; private String positiveButtonText = "Yes"; private String negativeButtonText = "No"; private String messageText = "....?"; private String toastText = "...."; private Context context; private AlertDialog alertDialog; Dialog dialog; public DialogUtils(Context context, Dialog dialog) { super(); this.context = context; this.dialog = dialog; } /** * * @param positiveButtonText * @param negativeButtonText * @param messageText * @param toastText * @param context */ public DialogUtils(String positiveButtonText, String negativeButtonText, String messageText, String toastText, Context context) { super(); this.positiveButtonText = positiveButtonText; this.negativeButtonText = negativeButtonText; this.messageText = messageText; this.toastText = toastText; this.context = context; } public void createDialog(){ alertDialog = new AlertDialog.Builder(this.context).create(); alertDialog.setTitle(title); alertDialog.setButton(positiveButtonText, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { return; }}); alertDialog.setButton(positiveButtonText, createPositiveOnClickListener()); alertDialog.setButton2(negativeButtonText, createNegativeOnClickListener()); alertDialog.setMessage(messageText); alertDialog.show(); } private DialogInterface.OnClickListener createPositiveOnClickListener(){ return new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { IziDialogUtils.this.dialog.dismiss(); Toast.makeText(context, "Porzucono zmiany", Toast.LENGTH_SHORT).show(); } }; } private DialogInterface.OnClickListener createNegativeOnClickListener() { return new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { alertDialog.dismiss(); } }; } } 

    Oui, vous pouvez. Mais ici après avoir regardé la trace de la pile d'exception, il semble que vous donniez le mauvais contexte. Essayez de lancer une autre boîte de dialogue avec le même contexte ou le contexte de votre activité si ce n'est pas une vue enfant d'un parent tel que TabView.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.