토스트 보여주기

OneTwoThree·2022년 8월 7일

부스트코스 토스트 보여주기

토스트

간단한 메시지를 잠깐 보여줬다가 없어지는 뷰로 애플리케이션 위에 떠 있는 뷰라 할 수 있다.

토스트 위치 바꾸기

setGravity로 토스트 메세지가 표시되는 위치를 바꿀 수 있다.
그리고 일반적으로 검은색배경-하얀색 텍스트인데 이것도 바꿀 수 있다.

버튼을 하나 추가하고 java파일을 다음과 같이 작성한다

package com.example.toast;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Toast toast = Toast.makeText(getApplicationContext(),"위치가 바뀐 토스트",Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP|Gravity.LEFT,200,200);
                toast.show();
            }
        });
    }
}

버튼 객체를 먼저 findViewById 메소드로 얻어온다.
setOnClickListener를 이용해서 리스너를 등록한다
onClick 메소드를 오버라이딩한다.
makeText를 이용해서 토스트 객체를 만들고
setGravity 메소드로 위치를 설정해준다. x랑 y offset값도 줘야한다.
show 메소드로 화면에 표시한다.

토스트 모양 바꾸기

     Button button2 = (Button)findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public  void onClick(View v){
                LayoutInflater inflater = getLayoutInflater();
                inflater.inflate(R.layout.toastborder, (ViewGroup) findViewById(R.id.toast_layout_root));
            }
        });

.java파일에서 onCreate 메소드 내부에 다음과 같이 작성해준다.
버튼 2 객체를 얻어서 클릭 리스너를 등록한다.
LayoutInflater 객체를 만든다. 이걸로 xml파일을 객체화한다.
inflater의 inflate 메소드를 이용해서 resource>layout>toastborder 파일의 id가 toast_layout_root인 뷰를 객체화한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id="@+id/toast_layout_root"
    >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:textSize="40dp"

        />


</LinearLayout>

resource>layout>toastboarder.xml을 만들어준다.
toastborder.xml의 최상위 레이아웃인 LinearLayout에 id값을 부여한다.

Button button2 = (Button)findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public  void onClick(View v){
                LayoutInflater inflater = getLayoutInflater();
                View layout = inflater.inflate(R.layout.toastborder, (ViewGroup) findViewById(R.id.toast_layout_root));

                TextView text = (TextView) layout.findViewById(R.id.text);


            }
        });

inflater를 이용해서 객체화 한것을 layout 변수로 받아온다.
그러면 이 layout 변수는 xml 파일의 최상위 LinearLayout 뷰가 객체화 된 것이고
그 안에는 TextView가 있다.
그 TextView의 id값을 이용해서 텍스트 뷰 객체를 가져온 것이다.

이렇게 얻은 TextView를 토스트의 기본 모양으로 만들 것이다.

Button button2 = (Button)findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public  void onClick(View v){
                LayoutInflater inflater = getLayoutInflater();
                View layout = inflater.inflate(R.layout.toastborder, (ViewGroup) findViewById(R.id.toast_layout_root));

                TextView text = (TextView) layout.findViewById(R.id.text);
                text.setText("모양을 바꾼 토스트");


                Toast toast = new Toast(getApplicationContext());
                toast.setGravity(Gravity.CENTER,0,-100);
                toast.setDuration(Toast.LENGTH_LONG);
                toast.setView(layout);

                toast.show();

            }
        });

text.setText 메소드로 텍스트뷰에 내용을 넣어준다.

Toast 객체를 만든다.
setGravity로 위치를 설정해준다.
setDuration으로 지속시간을 설정해준다.
setView로 모양을 위에서 얻은 layout 객체로 바꿔준다.
show 메소드로 화면에 표시한다.

이렇게 토스트 모양을 예쁘게 바꿀 수 있다.

모양을 더 예쁘게 바꾸고 싶다.
지금 toastborder.xml에 있는 리니어레이아웃 내부의 텍스트뷰를 가져다가 토스트로 사용하고 있다.
이 텍스트뷰의 배경을 더 예쁘게 하기 위해 toast.xml을 drawable에 만들어서 텍스트뷰의 background 속성에 지정해주자.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <stroke
        android:width="4dp"
        android:color="#ffffff00"
        />
    <solid
        android:color="#ff883300"
        />
    <padding
        android:left="20dp"
        android:top="20dp"
        android:right="20dp"
        android:bottom="20dp"/>
    <corners
        android:radius="15dp"
        />



</shape>

toast.xml 파일을 이렇게 작성해준다.

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:textSize="40dp"
        android:background="@drawable/toast"
        />

그리고나서 TextView의 속성을 이렇게 지정해준다.

이렇게 xml 파일에서 설정한 내용대로 토스트 모양이 바뀐다
사실 더 못생겨진거같다. 중요한 것은 원하는 형태로 바꿀 수 있다는 것이다.
이렇게 색상까지 바꾸는 경우는 많지는 않다.

스낵바

토스트 메세지 대신 스낵바를 사용하는 경우도 많다.
스낵바는 외부 라이브러리에 있다.

file>project structure>dependencies 에서 외부 라이브러리 확인가능

design을 검색하고 찾아보자.
이렇게 implemantation을 해주면 build.gradle 파일에 자동을 포함된다.

build.gradle에 추가된 모습이다.
즉 외부 모듈을 추가하면 안드로이드 스튜디오가 자동으로 이렇게 사용할 수 있게 해준다.

build.gradle 맨 위를 보면 compile sdk 버전이 표시된다.
이 버전이랑 design 버전이랑 달라서 문제가 된다면 (sdk 버전이 더 낮으면)
sdk 버전을 25.+ 이런식으로 하면 25버전의 최신버전을 알아서 사용함

        Button button3 = (Button) findViewById(R.id.button3);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Snackbar.make(v,"스낵바입니다.",Snackbar.LENGTH_LONG).show();
            }
        });

코드를 보면 역시 버튼의 뷰를 id로 찾아서 객체 얻어오고 리스너 등록하는것 까지는 같다.
그리고 Snackbar.make메소드로 스낵바를 표시한다.
스낵바는 LENGTH를 계속 스낵바가 떠 있게 설정할 수도 있어서 토스트보다 유용할 때가 있다.

스낵바도 기본은 검은 배경에 하얀 텍스트인데 원하면 바꿀 수 있다.

0개의 댓글