2014-11-18 16 views
6

Si prega di leggere la domanda prima di rispondere con la vostra routine standard per stampare un toast :)Toast personalizzati schermo superiore

mi piacerebbe per visualizzare un Toast personalizzato in alto a sinistra dello schermo. Uso questo codice per creare la tostatura:

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

Tuttavia, in alcuni dispositivi , per esempio Samsung Galaxy S4, il toast non è posizionato a (0,0), ma con un margine come 40-50 pixel. Molti altri dispositivi funzionano come previsto.

Io sono positivo il margine viene aggiunto dal WindowManager (La vista brindisi è aggiunto come una visualizzazione di tipo TYPE_TOAST al WindowManager)

Perché? Può essere modificato? Si prega di consultare il codice qui sotto, ho clonato Toast.java nella mia stessa classe e isolato le linee in cui viene aggiunta la vista al WM:

// 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); 

Quindi sembra come se fosse l'WindowManager che è l'aggiunta di questo margine su quei dispositivi. Sembra un'area sicura o qualcosa del genere, ma non riesco a trovare dove (o se) questo può essere cambiato.

Aiuto apprezzato.

+0

Ho notato che lo spazio in alto è 4.0+. Hai mai capito come risolvere questo? – Ali

+1

Non importa, capito, vedi la mia risposta qui sotto. – Ali

risposta

3

L'ho capito.

partire 4.4+ si deve aggiungere il seguente bandiera:

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

Questo permetterà al brindisi per essere posizionato tutta la strada fino alla cima.

1

Si prega di provare la seguente:

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

controllare anche il layout gonfiato, che potrebbe essere la causa del problema. Potresti usare MatchParent per quella vista e il centro di gravità.

+0

Come vedi nella domanda, La gravità ha già il TOP oltre a FILL_HORIZONTAL (anche se non funziona con solo TOP). Il layout gonfiato non causa positivamente il problema (è un semplice TextView SingleLine senza padding o margine) – 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

grazie per aver implementato un brindisi parlante ma non è collegato al mio problema! – rupps

0

È possibile provare questo metodo per visualizzare il pane tostato al centro dello schermo. Se si desidera visualizzare il pane tostato in cima, è possibile modificare il msg.getYOffset(). Ecco il codice. Prova questo

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. 

Spero che questo ti possa aiutare. Happy Coding :)

+0

Come ho affermato nella domanda, l'impostazione dei parametri del margine su 0 non funziona perché il gestore della finestra aggiunge il margine stesso. – rupps

Problemi correlati