2017-10-20 7 views
6

Je veux montrer PopupWindow surtout la fenêtre (par exemple: une autre popupWindow, dialogue, un autre écran d'activité) sans demande SYSTEM_ALERT_WINDOW donc j'utiliser WindowManager.LayoutParams.TYPE_TOASTAfficher popupWindow avant tout fenêtre pour cible Android 26

public void showSimplePopupWindow() { 
    final View popupView = layoutInflater.inflate(R.layout.popup_layout_2, null); 

    final PopupWindow popupWindow = new PopupWindow(popupView); 
    ...config popup window... 

    PopupWindowCompat.setWindowLayoutType(popupWindow, WindowManager.LayoutParams.TYPE_TOAST); 
    popupWindow.showAsDropDown(findViewById(R.id.button_show_popup_window)); 
} 

Il fonctionne bien dans toute la version Android si je définis targetSdkVersion < 26.

Actuellement, si je garde le code ci-dessus et mettre à jour la cible targetSdkVersion-26 alors il se bloque avec dispositif api 25-26 à l'exception android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?

Je vois que TYPE_TOAST est dépréciée dans sdk 26 et ils suggèrent de utiliser TYPE_APPLICATION_OVERLAY. Cependant, quand je l'utilise TYPE_APPLICATION_OVERLAY, AndroidStudio montrent TYPE_APPLICATION_OVERLAY nécessaire api 26. Par conséquent, TYPE_APPLICATION_OVERLAY ne fonctionnent bien avec le dispositif api 26, pour le dispositif api < 26, il plantera (même j'ai permis Display/Draw over other app la permission) enter image description here

est-il toute autre façon de faire TYPE_TOAST travailler avec la cible api 26? Toute aide ou suggestion serait grandement appréciée.

+0

Je sais que ce n'est pas un moyen standard, mais en utilisant une activité transparente pour montrer popupWindow peut vous aider dans ce cas – misagh

Répondre

0

depuis:

une option serait à check the System Version at Runtime et, en fonction de sa valeur, en utilisant la bonne constante.

+0

merci pour votre réponse, mais quand j'utilise TYPE_TOAST avec la version cible 26, le périphérique avec api 25 va planter –

+0

@ PhanVanLinh pourquoi ne pas utiliser TYPE_APPLICATION_OVERLAY lorsque vous détectez à l'exécution la version cible est 26? – VonC

+0

Désolé, je ne comprends pas bien votre commentaire. Si je mets la 'target version à 26',' TYPE_APPLICATION_OVERLAY' ne fonctionne qu'avec le périphérique api 26, pour le périphérique api <26, il va planter. J'ai mentionné dans le dernier passé de ma question –