пользовательский тост в верхней части экрана
Пожалуйста, прочитайте вопрос, прежде чем ответить на него с помощью стандартной процедуры, чтобы напечатать тост :)
Я хотел бы отобразить пользовательский тост в верхнем левом углу экрана. Я использую этот код для создания тостов:
Toast mFixedToast = new Toast(getApplicationContext());
mFixedToast.setDuration(timeout);
mFixedToast.setView(myInflatedLayout);
mFixedToast.setGravity(Gravity.TOP|Gravity.FILL_HORIZONTAL, 0, 0);
mFixedToast.setMargins(0,0);
Однако, в некоторых устройствах, например Samsung Galaxy S4, тост расположен не на (0,0), а с запасом, как 40-50 пикселей. многие другие устройства работают, как и ожидалось.
Я уверен, что маржа добавляется к WindowManager (тост-представление добавляется как представление типа TYPE_TOAST в WindowManager)
Почему это так? Можно ли его изменить? Пожалуйста, смотрите код ниже, я клонировал тост.java в мой собственный класс и выделил строки, где вид добавляется к 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);
Таким образом, похоже, что это WindowManager, который добавляет Это поле на этих устройствах. Похоже на безопасную зону или что-то в этом роде, но я не могу найти, где (или если) это можно изменить.
Помогите оцененный.
4 ответа:
Я понял это.
Начиная с версии 4.4+ вы должны добавить следующий флаг:
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { mParams.flags = mParams.flags | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; }
Это позволит вашему тосту быть расположенным до самого верха.
Пожалуйста, попробуйте следующее:
mFixedToast.setGravity(Gravity.TOP, 0, 0);
Также проверьте завышенный макет, который может быть причиной проблемы. Возможно, для этого вида и центра тяжести вы используете MatchParent.
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(); }
Вы можете попробовать этот метод для отображения тостов в центре экрана. Если вы хотите, чтобы тост был сверху.вы можете изменить
msg.getYOffset()
. Вот код. Попробуйте это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.
Я надеюсь, что это поможет вам. Счастливое Кодирование :)