7
votes

Problème avec la fenêtre contextuelle

J'essaie de définir une fenêtre contextuelle similaire à l'ancienne section de commentaires Facebook.

Boîte de dialogue de coin arrondi mais je suis confronté à un problème avec la taille de la boîte de dialogue et showatlocation de la boîte de dialogue.

Quand j'essaye ceci code sur différents mobiles:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_bg"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10px">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="horizontal">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/popup_rcv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <EditText
            android:id="@+id/new_comment_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Please enter Comment" />

        <Button
            android:id="@+id/comment_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Submit" />
    </LinearLayout>
</LinearLayout>

Fichier Xml:

        val display = windowManager.defaultDisplay
        val size = Point()
        display.getSize(size)
        val popupWindow = PopupWindow(customView, size.x-30, size.y-300, true)
        popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, -3, 100)
        popupWindow.setAnimationStyle(R.style.PopupAnimation)

// Animation de Source

Sortie sur Oneplus 6T: One plus

Dans un plus, mon animation est également désactivée lorsque je change .showAtLocation en d'autres nombres

Sortie sur Lenovo K8 Remarque: strong>

 K8 Note

Dans la note K8, l'emplacement du Popup change si je passe à une autre valeur.

Merci à Avancez.


1 commentaires

Pourquoi ne pas simplement utiliser la boîte de dialogue à la place, cela donnera l'effet souhaité à moins que vous ne vouliez l'animation.C'est un moyen plus simple d'inviter l'utilisateur à faire des commentaires. De cette façon, vous n'avez pas à vous soucier de l'endroit où il apparaîtra et vous pouvez ajouter des styles personnalisés à la boîte de dialogue stackoverflow.com/questions/12351330/...


4 Réponses :


5
votes

On dirait que ces 2 téléphones ont des résolutions d'écran différentes. Vous devez donc utiliser DP au lieu de pixels. Consultez ce message

Taille de la fenêtre contextuelle . Tout d'abord, vous devez convertir la taille de la boîte de dialogue en pixels. Ce sont des valeurs aléatoires et elles sont codées en dur, mais vous pouvez également les extraire des ressources ou du harcode.

val popUpLeftSideMarginDp = 50
val popUpTopMarginDp = 100

val popUpXPoint = convertDpToPx(popUpLeftSideMarginDp)
val popUpYPoint = convertDpToPx(popUpTopMarginDp)

popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, popUpXPoint, popUpYPoint)

Position de la fenêtre contextuelle . Tout d'abord, vous devez convertir dp en px, puis vous pouvez calculer la position de la fenêtre contextuelle liée à la taille de l'écran.

val popUpWidthDp = 200
val popUpHeightDp = 100

val popUpWidthPx = convertDpToPx(popUpWidthDp)
val popUpHeightPx = convertDpToPx(popUpHeightDp)

val popupWindow = PopupWindow(customView, popUpWidthPx, popUpHeightPx, true)

Regardez ceci répondez pour comprendre comment convertir dp en pixels et vice versa.

Si la taille et la position de la fenêtre contextuelle doivent être liées à la taille de l'écran, vous devez modifier ces valeurs :

  • popUpHeightPx, popUpWidthPx - taille de la fenêtre contextuelle

  • popUpXPoint, popUpYPoint - position de la fenêtre contextuelle

Faites-moi savoir si vous avez besoin d'explications détaillées.


5 commentaires

où j'ai besoin de changer le pixel en dp signifie que je n'utilise pas de pixels nulle part, même pas dans mon fichier xml, vous pouvez donc fournir plus d'informations. Désolé, je suis nouveau dans la conception Android


il y avait une animation du curseur dans le popup mais il a été supprimé après avoir mis ces valeurs -3 et 100


Mise à jour de la réponse


cela ne fonctionne pas, il dit que java.lang.Float ne peut pas être converti en java.lang.Double


Je pensais que vous utilisiez Kotlin. Où exactement avez-vous l'exception? Vous devez convertir explicitement Float en Double.



1
votes

Créez PopupWindow comme:

popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, 0, 0)

Et définissez son emplacement comme:

popupWindow= new PopupWindow(
                        customView,
                        LayoutParams.MATCH_PARENT,
                        LayoutParams.MATCH_PARENT
                );

Et ajoutez la marge supérieure customView 10dp ou 5dp en xml


7 commentaires

monsieur, j'ai un problème avec l'emplacement et l'animation du popup si je change showatlocation à 0, 0 alors dans oneplus cela s'affiche correctement, mais lorsque j'utilise ces valeurs dans k8 note, cela donne un problème et si j'utilise -3, 100 alors cela fonctionne parfaitement dans les deux mais l'animation de la boîte de dialogue ne s'affiche pas


Salut Ashish, avez-vous essayé de définir le paramètre de hauteur et de largeur comme "LayoutParams.WRAP_CONTENT"


montre-t-il la même hauteur que l'image oneplus car j'ai besoin d'une boîte de dialogue de cette taille


pouvez-vous s'il vous plaît ajouter le code xml de votre "customView", afin que je puisse vous aider plus


pouvez-vous ajouter une image réelle de "Sortie sur Lenovo K8 Note" lorsque l'emplacement est défini sur 0,0


quels paramètres de mise en page j'utilise il y a beaucoup de paramètres


continuons cette discussion dans le chat .



0
votes

Essayez avec la solution ci-dessous: c'est en Java mais vous pouvez le convertir en Kotlin

PopupWindow popupWin = new PopupWindow(mContext);

// Measure layout here, then we can get measureHeight.
layout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
popupWin .setWidth(layout.getMeasuredWidth()); 
popupWin .setHeight(layout.getMeasuredHeight()); //you can pass height as you want.
popupWin .setContentView(layout);
popupWin .showAsDropDown(anchorView,0 ,0, Gravity.NO_GRAVITY);

Ici anchorView est une vue dans laquelle nous voulons ouvrir PopupWindow dans une liste déroulante.

PopupWindow


5 commentaires

Je recherche une section de commentaires similaire à instagram mais de taille plus petite mais il y a un problème avec la boîte de dialogue. alors est-ce que anchorView m'aide?


vous pouvez essayer avec lui pour donner de la hauteur et anchorView.


pouvez-vous m'aider avec la boîte de dialogue ou la fenêtre contextuelle en raison d'un problème dans plusieurs sections


Veuillez passer par avec le lien ajouté dans ma réponse.


J'ai essayé avec votre lien mais il n'y a pas de solution à ma question car elle colle au bas de l'écran et l'animation pour la sortie disparaît également



0
votes

Je pense que vous aimeriez convertir les pixels en dp, plutôt que dp en pixels, afin de s'adapter à différentes résolutions d'écrans. Plus d'informations ici .

Voici comment convertir des pixels en dp.


0 commentaires