Показывать виджет тоста под представлением
Для тех, кто раньше помогал мне в этом проекте, большое спасибо! У моего кода больше нет никаких проблем, и я сделал дополнительные настройки. Теперь, когда приложение действительно надежное, я хочу сделать еще одну вещь.
Смотрите снимок экрана макет здесь.
Обычно в нижней части экрана отображается тост. Я хочу, чтобы он отображался чуть ниже (8dp) кнопки "Отправить" после вызова OnClick. Как я могу это сделать.
Смотрите мой обновленный полный проект здесь.
package com.lookjohn.guessnumber;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
Random random;
Button button;
EditText text;
int input;
int MIN, MAX;
int comp;
int guesses;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
random = new Random();
button = (Button)findViewById(R.id.button1);
text = (EditText)findViewById(R.id.editText1);
MIN = 1;
MAX = 100;
comp = random.nextInt(MAX - MIN + 1) + MIN; // Generate random number between 1 and 100.
guesses = 0;
button.setOnClickListener(myhandler1);
}
View.OnClickListener myhandler1 = new View.OnClickListener() {
public void onClick(View v) {
// Implemented max number of guesses, detect
// number of guesses and return from the method.
String value = text.getText().toString(); // Get value from input from editTextView
// If user submits an empty EditText, return to prevent a crash.
if (value.isEmpty()) {
Toast.makeText(MainActivity.this, "You must enter a guess!", Toast.LENGTH_SHORT);
return;
}
input = Integer.parseInt(value); // Turn string into integer
guesses++;
if (input > 100) {
Toast.makeText(MainActivity.this,
"That number is greater than 100. Not Valid!",
Toast.LENGTH_SHORT).show();
return;
}
else if (input < comp)
Toast.makeText(MainActivity.this,
"Your number is too small.",
Toast.LENGTH_SHORT).show();
else if (input > comp)
Toast.makeText(MainActivity.this,
"Your number is too big.",
Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this,
"Good job! The answer was " + comp + ".\n" +
"You made " + guesses + " guesses.\n" +
"Restart the app to try again.",
Toast.LENGTH_LONG).show();
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Ответы
Ответ 1
Из того, что я узнал, это лучшее, что я придумал для программы. Выполнение этого помещает сообщение Toast в центр телефона.
if(input > 100) {
Toast toast = Toast.makeText(MainActivity.this,
R.string.over_guess,
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return;
}
else if(input < comp) {
Toast toast = Toast.makeText(MainActivity.this,
getString(R.string.guess_low, input),
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else if(input > comp) {
Toast toast = Toast.makeText(MainActivity.this,
getString(R.string.guess_high, input),
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else {
Toast toast = Toast.makeText(MainActivity.this,
getString(R.string.correct, comp, guesses),
Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
Ответ 2
android.widget.Toast определяет кучу полезных методов, которые позволяют настраивать внешний вид сообщения тоста. Метод, который вы должны изучить, - setGravity (int, int, int). При 0 смещении кода ниже будет прикрепляться тост сверху до нижней части предоставленного вида и тост в центр обзора.
public static void positionToast(Toast toast, View view, Window window, int offsetX, int offsetY) {
// toasts are positioned relatively to decor view, views relatively to their parents, we have to gather additional data to have a common coordinate system
Rect rect = new Rect();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
// covert anchor view absolute position to a position which is relative to decor view
int[] viewLocation = new int[2];
view.getLocationInWindow(viewLocation);
int viewLeft = viewLocation[0] - rect.left;
int viewTop = viewLocation[1] - rect.top;
// measure toast to center it relatively to the anchor view
DisplayMetrics metrics = new DisplayMetrics();
window.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(metrics.widthPixels, MeasureSpec.UNSPECIFIED);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(metrics.heightPixels, MeasureSpec.UNSPECIFIED);
toast.getView().measure(widthMeasureSpec, heightMeasureSpec);
int toastWidth = toast.getView().getMeasuredWidth();
// compute toast offsets
int toastX = viewLeft + (view.getWidth() - toastWidth) / 2 + offsetX;
int toastY = viewTop + view.getHeight() + offsetY;
toast.setGravity(Gravity.LEFT | Gravity.TOP, toastX, toastY);
}
Использование этого метода потребует модификации связанных тостов линий в методе onClick:
int offsetY = getResources().getDimensionPixelSize(R.dimen.toast_offset_y);
Toast toast = Toast.makeText(MainActivity.this, "That number is greater than 100. Not Valid!", Toast.LENGTH_SHORT);
positionToast(toast, v, getWindow(), 0, offsetY);
toast.show();
Ответ 3
По вашему вопросу, как показать тост в определенной позиции, вы можете сделать следующее: -
Toast toast = new Toast();
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
toast.makeText(getApplicationContextt(),"Text",Toast.LENGTH_SHORT);
toast.show();
Вы можете вносить изменения в это как код, чтобы изменить положение тоста: -
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
Ответ 4
Я бы просто хотел добавить в solmaks ответ.
в positionToast:
...
int toastHeight= toast.getView().getMeasuredHeight();
// compute toast offsets
...
int toastY = viewTop + (view.getHeight() - toastHeight) / 2 + offsetY;
в onClick:
positionToast(toast, view, getWindow(), 0, 0);
Это, похоже, отлично подходит для Тоста, на мой взгляд, независимо от того, где находится представление. В моем коде есть предположение, что Toast всегда будет меньше, чем вид, в котором он находится.
Ответ 5
Из руководства разработчика вы можете разместить свой тост, используя toast.setGravity(). Я нахожу это на http://developer.android.com/guide/topics/ui/notifiers/toasts.html
Позиционирование вашего тоста Стандартное уведомление тоста появляется рядом с нижней части экрана, по горизонтали. Вы можете изменить это позиции с методом setGravity (int, int, int). Это принимает три параметры: постоянная силы тяжести, смещение по оси x и положение y смещение.
Например, если вы решите, что тост должен появиться в верхний левый угол, вы можете установить гравитацию следующим образом:
toast.setGravity(Gravity.TOP | Gravity.LEFT, 0, 0); Если вы хотите подтолкнуть положение вправо, увеличьте значение второго параметра. Чтобы подтолкнуть его, увеличьте значение последнего параметра.
Я думаю, вы можете получить позицию своей кнопки и переслать ее указанному методу
Ответ 6
Ни один из ответов не помог мне, я сделал комбинацию из приведенных выше ответов, и я получил решение.
![enter image description here]()
Второй таймер - это целевой вид.
public static void displayToastUnderView(Activity activity, View view, String text) {
Toast toast = Toast.makeText(activity, text, Toast.LENGTH_SHORT);
toast.setGravity( Gravity.TOP, view.getLeft() - view.getWidth() / 2 - toast.getView().getWidth() / 2, view.getBottom());
toast.show();
}