จะเปลี่ยนตำแหน่งของ Toast ใน Android ได้อย่างไร?


279

เมื่อฉันใช้Toastเพื่อแสดงข้อความป๊อปอัพบางอย่างบนหน้าจอมันจะแสดงข้อความเล็กน้อยเหนือด้านล่างของหน้าจอซึ่งเป็นตำแหน่งเริ่มต้น

ตอนนี้ฉันต้องการแสดงในหน้าจอตรงกลางหรือบางแห่งตามที่ฉันเลือก

ใครช่วยแนะนำฉันให้บรรลุถึงสิ่งนี้ได้บ้าง

คำตอบ:


410

จากเอกสาร ,

วางตำแหน่งขนมปังปิ้งของคุณ

การแจ้งเตือนมาตรฐานของขนมปังจะปรากฏขึ้นใกล้กับด้านล่างของหน้าจอโดยมีศูนย์กลางอยู่ในแนวนอน คุณสามารถเปลี่ยนตำแหน่งนี้ด้วย setGravity(int, int, int)วิธีการ สิ่งนี้ยอมรับพารามิเตอร์สามตัว: Gravityค่าคงที่x-positionค่าชดเชยและy-positionค่าชดเชย

ตัวอย่างเช่นหากคุณตัดสินใจว่าขนมปังควรปรากฏที่มุมบนซ้ายคุณสามารถกำหนดแรงโน้มถ่วงเช่นนี้:

toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

หากคุณต้องการเลื่อนตำแหน่งไปทางขวาให้เพิ่มค่าของพารามิเตอร์ที่สอง ในการเขยิบมันลงให้เพิ่มค่าของพารามิเตอร์สุดท้าย


11
จำนวนเต็มมีค่าเท่าไหร่? พวกเขาเป็น DPI? หรือสูงสุดคืออะไร?
clifgray

9
อาจจะชี้ให้เห็นอย่างชัดเจน แต่Gravity.CENTER_VERTICALจะทำให้ขนมปังอยู่ตรงกลางของหน้าจอ
เฟลิกซ์

3
x และ y ออฟเซ็ตเป็นพิกเซลดังนั้นสูงสุดคือความกว้าง / ความสูงในการแสดงผลของคุณ
bluewhile

2
@ Pentium10 เอกสารระบุว่าออฟเซ็ตมีหน่วยเป็นพิกเซล ฉันควรสมมติว่าหน่วย "px" ตรงข้ามกับหน่วย "dp" หรือไม่
batbrat

ข้อความอวยพรของฉันใน galaxy s6 ใหม่ของฉันแสดงใน 2 ตำแหน่งที่แตกต่างกัน ก่อนในแนวตั้งศูนย์กลางแนวนอนด้านซ้ายจากนั้นเลื่อนลงไปที่กึ่งกลางแนวนอนแนวตั้งด้านล่าง ผลกระทบนี้จะไม่เกิดขึ้นกับอุปกรณ์ทดสอบรุ่นเก่าของฉัน ฉันแสดงข้อความแต่ละข้อความสองครั้งติดต่อกันเนื่องจากหน้าจอใดก็ตามที่แตะหน้าจอเพื่อฆ่าขนมปังก้อนแรกทันที,
Androidcoder

150

หากคุณได้รับข้อผิดพลาดที่ระบุว่าคุณต้องเรียกใช้ makeText รหัสต่อไปนี้จะแก้ไข:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();

1
makeText ส่งคืนออบเจกต์ Toast ดังนั้นคุณสามารถเพิ่ม. addGravity และ .show หลังจาก makeText
NikkyD

1
"ถ้าคุณได้รับข้อผิดพลาดที่ระบุว่าคุณต้องเรียก makeText" - ข้อผิดพลาดจะปรากฏขึ้นเมื่อใด
Jacek Laskowski

1
ข้อผิดพลาดเกิดขึ้นหากคุณใช้ Constructor ดังนั้นnew Toast(context)แทนที่จะเป็นToast.makeText(...)
bluewhile

16

คุณสามารถปรับแต่งตำแหน่งของขนมปังของคุณโดยใช้:

setGravity(int gravity, int xOffset, int yOffset)

เอกสาร

สิ่งนี้ช่วยให้คุณมีความเฉพาะเจาะจงมากเกี่ยวกับตำแหน่งที่คุณต้องการให้ Toast เป็น

หนึ่งในสิ่งที่มีประโยชน์มากที่สุดเกี่ยวกับพารามิเตอร์ xOffset และ yOffset คือคุณสามารถใช้เพื่อวาง Toast ที่สัมพันธ์กับมุมมองที่แน่นอน

ตัวอย่างเช่นหากคุณต้องการสร้าง Toast แบบกำหนดเองที่ปรากฏอยู่ด้านบนของปุ่มคุณสามารถสร้างฟังก์ชันดังนี้:

// v is the Button view that you want the Toast to appear above 
// and messageId is the id of your string resource for the message

private void displayToastAboveButton(View v, int messageId)
{
    int xOffset = 0;
    int yOffset = 0;
    Rect gvr = new Rect();

    View parent = (View) v.getParent(); 
    int parentHeight = parent.getHeight();

    if (v.getGlobalVisibleRect(gvr)) 
    {       
        View root = v.getRootView();

        int halfWidth = root.getRight() / 2;
        int halfHeight = root.getBottom() / 2;

        int parentCenterX = ((gvr.right - gvr.left) / 2) + gvr.left;

        int parentCenterY = ((gvr.bottom - gvr.top) / 2) + gvr.top;

        if (parentCenterY <= halfHeight) 
        {
            yOffset = -(halfHeight - parentCenterY) - parentHeight;
        }
        else 
        {
            yOffset = (parentCenterY - halfHeight) - parentHeight;
        }

        if (parentCenterX < halfWidth) 
        {         
            xOffset = -(halfWidth - parentCenterX);     
        }   

        if (parentCenterX >= halfWidth) 
        {
            xOffset = parentCenterX - halfWidth;
        }  
    }

    Toast toast = Toast.makeText(getActivity(), messageId, Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER, xOffset, yOffset);
    toast.show();       
}

2
คำตอบนี้stackoverflow.com/a/21026866/630833ใช้ขนาดของขนมปังเข้าสู่การพิจารณาซึ่งเป็นประโยชน์กับผม
jayeffkay

นี่เป็นตัวอย่างที่ดี ขอบคุณ
wonsuc


7
Toast mytoast= Toast.makeText(getApplicationContext(), "Toast Message", 1);  
mytoast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);  // for center horizontal
//mytoast.setGravity(Gravity.CENTER_VERTICAL);       // for center vertical 
//mytoast.setGravity(Gravity.TOP);                       // for top
mytoast.show();

โค้ดด้านบนจะช่วยให้คุณแสดงขนมปังที่อยู่ตรงกลางของหน้าจอหรือตามทางเลือกของคุณสำหรับการตั้งค่าแรงโน้มถ่วงของขนมปังตามที่คุณต้องการ

หมายเหตุ: สำหรับกระบวนการนี้คุณต้องใช้ object ของ Toast


3

วิธีการเปลี่ยนสีตำแหน่งและสีพื้นหลังของขนมปังคือ:

Toast toast=Toast.makeText(getApplicationContext(),"This is advanced toast",Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0);
View view=toast.getView();
TextView  view1=(TextView)view.findViewById(android.R.id.message);
view1.setTextColor(Color.YELLOW);
view.setBackgroundResource(R.color.colorPrimary);
toast.show();

สำหรับคำอธิบายทีละบรรทัด: https://www.youtube.com/watch?v=5bzhGd1HZOc


ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
greg-449

2

การตั้งค่าขนมปังที่หน้าจอด้านบน

toast.setView(view);
toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show(); 

ตอนนี้ที่ด้านล่าง

 toast.setView(view);
 toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show();  

เช่นเดียวกับที่เราสามารถตั้งขนมปังปิ้งในซ้ายขวาและตรงกลาง

คลิกที่นี่


0

// คลาสขนมปังปิ้งแบบกำหนดเองที่คุณสามารถแสดงขนมปังแบบกำหนดเองหรือค่าเริ่มต้นตามต้องการ)

public class ToastMessage {
            private Context context;
            private static ToastMessage instance;

            /**
             * @param context
             */
            private ToastMessage(Context context) {
                this.context = context;
            }

            /**
             * @param context
             * @return
             */
            public synchronized static ToastMessage getInstance(Context context) {
                if (instance == null) {
                    instance = new ToastMessage(context);
                }
                return instance;
            }

            /**
             * @param message
             */
            public void showLongMessage(String message) {
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }

            /**
             * @param message
             */
            public void showSmallMessage(String message) {
                Toast.makeText(context, message, Toast.LENGTH_LONG).show();
            }

            /**
             * The Toast displayed via this method will display it for short period of time
             *
             * @param message
             */
            public void showLongCustomToast(String message) {
                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
                TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
                msgTv.setText(message);
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
                toast.setDuration(Toast.LENGTH_LONG);
                toast.setView(layout);
                toast.show();


            }

            /**
             * The toast displayed by this class will display it for long period of time
             *
             * @param message
             */
            public void showSmallCustomToast(String message) {

                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
                TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
                msgTv.setText(message);
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
                toast.setDuration(Toast.LENGTH_SHORT);
                toast.setView(layout);
                toast.show();
            }

        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.