2014-01-09 4 views
5

Для тех, кто помог мне раньше в отношении этого проекта, большое вам спасибо! У моего кода больше нет никаких проблем, и я сделал дополнительные настройки. Теперь, когда приложение действительно надежное, я хочу сделать еще одну вещь.Показать тост виджет под видом

Просмотреть снимок экрана layout здесь.

Обычно в нижней части экрана отображается тост. Я хочу, чтобы он отображался чуть ниже (8dp) кнопки «Отправить» после вызова OnClick. Как я могу это сделать.

См. Мои updated complete project здесь.

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

Просто комментарий по стилю - вы не должны вставлять строки в свой код. Это предотвращает интернационализацию вашего приложения. Используйте строковый ресурс, такой как getString (R.string.message); –

+0

Andrew: Я вижу, спасибо за комментарий. Я исправлю это сразу. – jjkim

ответ

0

Из того, что я узнал, что это лучшее, что я придумал для этой программы. Это делает сообщение 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(); 
     } 
+0

В моем ответе я предоставил вам возможность позиционировать тост относительно любого представления, которое должно было решить вашу первоначальную проблему. –

+0

Правильно. Спасибо, солмакс! – jjkim

+1

Пожалуйста, отметьте ответ соответствующим образом, если это было полезно. –

1

Для вашего вопроса о том, как показать тост в определенной позиции, вы можете сделать это: -

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

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(); 
+1

toast.getView(). Measure (widthMeasureSpec, heightMeasureSpec); это хорошо и умно. Благодарю. – Maroloccio

0

От руководства разработчика, вы можете расположить Тост с помощью 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); Если вы хотите подтолкнуть положение вправо, увеличьте значение второго параметра. Чтобы подтолкнуть его, увеличьте значение последнего параметра.

Я думаю, что вы можете получить позицию вашей кнопки, и направить его в вышеуказанный метод

0

Ни один из ответов не выполнил эту работу, я сделал комбинацию из приведенных выше ответов, и я получил решение.

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(); 
    } 
+0

Что бы вы сделали, если вид расположен внизу? –

1

Я хотел бы добавить к адресу 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 всегда будет меньше, чем вид, в котором он находится.

Смежные вопросы