2014-11-18 16 views
6

Bitte lesen Sie die Frage, bevor Sie mit Ihrer Standard-Routine der Beantwortung eine Toast zu drucken :)benutzerdefinierter Toast auf Bildschirm oben

Ich mag einen benutzerdefinierten Toast in der oberen linken Ecke des Bildschirms angezeigt werden soll. Ich benutze diesen Code, um den Toast zu erstellen:

Toast mFixedToast = new Toast(getApplicationContext()); 
    mFixedToast.setDuration(timeout); 
    mFixedToast.setView(myInflatedLayout); 
    mFixedToast.setGravity(Gravity.TOP|Gravity.FILL_HORIZONTAL, 0, 0); 
    mFixedToast.setMargins(0,0); 

jedoch in einigen Geräten, zum Beispiel Samsung Galaxy S4 wird der Toast nicht auf (0,0) positioniert ist, aber mit einer Marge wie 40-50 Pixel. Viele andere Geräte funktionieren wie erwartet.

Ich bin sicher, die Marge durch den Windowmanager hinzugefügt wird (Die Toast Ansicht wird als Ansicht vom Typ TYPE_TOAST zum Windowmanager hinzugefügt)

Warum ist das so? Kann es geändert werden? Bitte beachten Sie den Code unten, habe ich Toast.java in meine eigene Klasse kloniert und isoliert die Linien, wo der Blick auf die WM hinzugefügt wird:

// LayoutParams for the TOAST view ... tried to change params.type but no luck. 
final WindowManager.LayoutParams params = mParams; 
params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
params.width = WindowManager.LayoutParams.WRAP_CONTENT; 
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
       | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 
      params.format = PixelFormat.TRANSLUCENT; 
params.windowAnimations = android.R.style.Animation_Toast; 
params.type = WindowManager.LayoutParams.TYPE_TOAST; 

mWM = (WindowManager)mView.getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
mParams.gravity = gravity; 

// CHECKED these all are 0 !!! 
mParams.x = mX; mParams.y = mY; 
mParams.verticalMargin = mVerticalMargin; 
mParams.horizontalMargin = mHorizontalMargin; 
. 
. 
if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this+" with "+mX+","+mY+","+mVerticalMargin+","+mHorizontalMargin); 
mWM.addView(mView, mParams); 

So sieht es aus wie es die Windowmanager ist, die diese Marge ist das Hinzufügen auf diesen Geräten. Sieht nach einem sicheren Bereich oder ähnlichem aus, aber ich kann nicht finden, wo (oder ob) das geändert werden kann.

Hilfe geschätzt.

+0

Ich habe bemerkt, der Platz an der Spitze ist 4.0+ Geräte. Haben Sie jemals herausgefunden, wie Sie das lösen können? – Ali

+1

Macht nichts, herausgefunden, seht meine Antwort unten. – Ali

Antwort

3

Ich habe das herausgefunden.

Ab 4.4+ Sie das folgende Flag hinzufügen:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     mParams.flags = mParams.flags | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 
} 

dies Ihre Toast ermöglichen wird, den ganzen Weg nach oben positioniert werden.

1

Bitte versuchen Sie folgendes:

mFixedToast.setGravity(Gravity.TOP, 0, 0); 

auch die aufgeblasene Layout überprüfen, die möglicherweise das Problem verursachen. Möglicherweise verwenden Sie das MatchParent für diese Ansicht und das Schwerpunktzentrum.

+0

Wie Sie in der Frage sehen, hat die Gravitation bereits TOP neben FILL_HORIZONTAL (obwohl es nicht nur mit TOP funktioniert). Das aufgeblähte Layout verursacht das Problem definitiv nicht (ist ein SingleLine TextView ohne Padding oder Rand) – rupps

0
private void Toast(String string) { 
     // TODO Auto-generated method stub 
     LinearLayout layout = new LinearLayout(this); 
     layout.setBackgroundResource(R.color.Orange); 
     TextView tv = new TextView(this); 
     tv.setTextColor(Color.YELLOW); 
     tv.setTextSize(25); 
     tv.setGravity(Gravity.Top); 
     tv.setText(string); 
     ImageView img = new ImageView(this); 
     img.setImageResource(R.drawable.ic_launcher2); 
     layout.addView(img); 
     layout.addView(tv); 
     Toast toast = new Toast(this); // context is object of Context write 
     tts.speak(string, TextToSpeech.QUEUE_FLUSH, null); // "this" if you are 
                  // an Activity 
     toast.setView(layout); 
     toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
     toast.show(); 
    } 
+0

danke für Ihre Umsetzung eines Toast sprechen, aber es ist nicht mit meinem Problem verbunden! – rupps

0

Sie können diese Methode versuchen, Toast in der Bildschirmmitte anzuzeigen. Wenn Sie Toast oben anzeigen möchten, können Sie die msg.getYOffset() ändern. Hier ist Code. Versuchen Sie diese

public static void displyToast(Context c, String str) { 
     Toast msg = Toast.makeText(c, str, Toast.LENGTH_SHORT); 
     msg.setGravity(Gravity.CENTER, msg.getXOffset()/2, 
       msg.getYOffset()/2); 
     msg.show(); 
    } 

msg.getXOffset()/2 take toast on center of screen horizintallly, whereas `msg.getYOffset()/2` takes toast on center of screen vertically. 

Ich hoffe, das wird Ihnen helfen. Happy Coding :)

+0

Wie ich in der Frage erwähnt habe, funktioniert die Einstellung von margin-Parametern auf 0 nicht, da der windowmanager den Rand selbst hinzufügt. – rupps

Verwandte Themen