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

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를 계속 스낵바가 떠 있게 설정할 수도 있어서 토스트보다 유용할 때가 있다.
스낵바도 기본은 검은 배경에 하얀 텍스트인데 원하면 바꿀 수 있다.