2016-10-13 2 views
1

Während ich Nougats neuen Multi-Window-Modus nutzte, bemerkte ich, dass eine Toast über einer anderen App angezeigt wird, wenn sich meine eigene App im oberen Fenster im Hochformat befindet. DieseWie positioniert man einen Toast im Nougat Multi-Window-Modus?

enter image description here

ist ... nicht gut überhaupt. Also habe ich versucht, meine Toast folgende this answer zu "Wie ändere ich die Position von Toast in Android?"

toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); 

Leider ist die Gravity scheint, als „Schwerkraft für den Bildschirm“ nicht „Schwerkraft für mein Fenster“ interpretiert werden.

Wie bekomme ich eine Toast irgendwo in der Nähe der Unterseite meines Fensters angezeigt und horizontal zentriert?

enter image description here

Antwort

2

Ich vermute, das ist das beabsichtigte Verhalten. Darüber hinaus gibt es keinen einfachen Weg, um das zu erreichen, was Sie wünschen, laut der Material Design Guidelines Toasts werden in erster Linie verwendet, um Systemmeldungen zu übermitteln und sollten am unteren Bildschirmrand erscheinen.

Meine Vermutung wäre, dass Systemmeldungen sich auf das Gerät als Ganzes beziehen sollten und nicht unbedingt anwendungsspezifisch sind, so dass dieses konsistente Verhalten sinnvoll ist. Das heißt, ich kann sehen, warum dieses Verhalten unerwünscht ist, da der Toast bei einer der Anwendungen praktisch 25% des Bildschirms einnimmt ... aber unabhängig von der Position des Toast wird er diesen Bildschirm wirklich verschlingen Immobilien, ob es auf Ihre Anwendung oder die unten ist.

Wenn Sie wirklich eine Problemumgehung implementieren möchten, ist hier die Implementierung für die vertikale Verschiebung des Toast. Eine kleine Variation sollte den Landscape-Modus erreichen, aber es ist ein bisschen nerviger.

View root = findViewById(R.id.root_main); 

int[] xy = new int[2]; 
root.getLocationOnScreen(xy); 

DisplayMetrics displayMetrics = new DisplayMetrics(); 
WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
wm.getDefaultDisplay().getMetrics(displayMetrics); 
int devHeight = displayMetrics.heightPixels; 

int viewHeight = root.getHeight(); 

Toast toast = Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_LONG); 
int yOffset = Math.abs(xy[1] - devHeight + viewHeight) + toast.getYOffset(); 
toast.setGravity(Gravity.BOTTOM, 0, yOffset); 
toast.show(); 
+0

danke für die Beantwortung, aber ich denke Toast kann von jeder App für kleine Nachrichten verwendet werden, wie das Beispiel im [Entwicklerhandbuch für Toast] (https://developer.android.com/guide/topics/ui/notifiers/toasts) .html) sagt. Wenn es einen Konsens gibt, dass Toasts nur für Systemnachrichten gedacht sind, warum erklären sie dann, wie man meinen Toast anpasst? Ich verwende sie für Dinge wie "Game Over" oder "10 Songs zur Playlist hinzugefügt". – 0X0nosugar

+0

(cont) Ich denke, es ist wirklich schlimm (sogar gefährlich), wenn Sie Standard-Toasts verwenden und die Benutzer können nicht einmal sehen, von welcher App die Nachricht kam. Und natürlich möchte ich nicht den Bereich einer anderen App abdecken. – 0X0nosugar

+0

Über die Problemumgehung: Könnten Sie etwas Code anzeigen? Ich möchte das mit meiner kleinen Beispiel-App aus der Frage testen. – 0X0nosugar

0

Verwendung SetGravity Methode mit Parametern: xOffset, yOffset.

Toast toast= Toast.makeText(getApplicationContext(),"Message Toast", Toast.LENGTH_SHORT); 
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0); 
toast.show(); 
+0

Dank für die Beantwortung aber mit 'Gravity.CENTER_HORIZONTAL' dem' Toast' in der Mitte des gesamten Bildschirms in Landschaft angezeigt wird, bedeutet dies, es zumindest teilweise über dem anderen app in meinem zweiten Bild erscheint. Gravity.TOP hingegen verursacht Probleme, wenn sich meine App im Hochformat und im unteren Fenster befindet. Wie ich schon sagte: Die Schwerkraft bezieht sich auf den ganzen Bildschirm, nicht auf mein Fenster. – 0X0nosugar

Verwandte Themen