티스토리 뷰

Android

1. Toast & Inflation

알 수 없는 사용자 2018. 9. 24. 15:40

안녕하세요~!

안드로이드 프로그래밍을 공부하면서 처음 글쓰네요 ㅎㅎㅎㅎ

책은 Do it! 안드로이드 앱 프로그래밍으로 공부한 소스를 가지고 남겨보겠습니다 ㅎㅎ

 제 기준으로 안다고 생각하는 내용은 올리지 않을 생각입니다~!


=============================================================


 일단 Toast입니다. 사실 안드로이드 공부하면서 제일 많이 접하게 되는 기능중 하나 같습니다.

목적에 따른 기능이 제대로 작동하는지 판단하거나 사용자에게 특정 문구를 알려주기 위해 사용되는 용도로 많이 쓰이는 것 같아요 ㅎ

많이 쓰이는 많큼 사용 방법도 간편하기 때문에 몇줄이면 끝나는 기능이지만 중요한 기능이기 때문에 올립니다!



Toast & Inflation


 사실 Toast의 의미를 두고 봤을 때는 프로그래밍을 처음 공부하는 사람입장에서는 읭?이라는 반응이 나올 수 있다 생각합니다. (저만 그런가,,.)

하지만 기능을 보고나면 안드로이드 언어 개발자가 센스있게 작명했구나 생각이 듭니다 ㅎㅎ


 일반적인 Toast기계를 보면 빵을 구워주는 기계인데 다 구워지면 툭!하고 튀어오르는 장면을 볼 수 있습니다. 이 장면에서 착안된 이름이라는데요..! ㅇㅁㅇ

어플에서 사용자가 어떤 기능을 작동했을 경우 그 기능이 UI에 표시되지 않거나 명확하게 들어나는 내용이 아니라면 사용자에게 알림메세지로 보여주는 역할입니다.

 이 Toast의 가장 큰 특징은 focus를 가지지 않는다는 것입니다. 예를 들어 제가 A에게 메시지를 보내고 있는데 B에게 메시지가 왔다는 Toast메시지를 받는다했을 때 Toast가 focus를 가진다면 아주 불편하겠죠...!? 하지만 Toast는 focus를 가지지 않기 때문에 아주 유용히 사용되는 부분입니다!!!

 

  

저는 일반 토스트 문구를 생성과 모양과 색 위치를 바꿔서 생성하는 것까지만 해보겠습니다.

기본적인 Layout은 사진으로만 첨부하고 코드는 따로 올리지 않겠습니다!

[Layout]


 1. 일반 토스트 문구

   토스트 띄우기 버튼을 누르면 토스트 문구가 뜨는 것을 살펴 보겠습니다.

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast toast = Toast.makeText(getApplicationContext(), "토스트 생성!",Toast.LENGTH_LONG); //ⓛ
toast.show();
}
});


  ① 의 구문을 보면 Toast 객체를 생성하기 위해 toast의 이름으로 생성했습니다. button을 눌렀을 시 작동하도록 리스너를 이용하여 표현한 코드입니다.

toast 객체에서는 Toast객체에 있는 정적함수 makeText로 생성됩니다.


 그렇다면 makeText의 인자를 해석하면 끝이겠네요!

 public static Toast makeText(Context context, String message, int duration) {...} 


 Context 객체는 일반적으로 Context클래스를 상속한 액티비티를 사용합니다.! 그렇기 때문에 context 인자값에는 만약 클래스의 이름이 Example_Toast라면 Example_Toast.this 라고 넘겨주면 될 듯합니다!


 message 인자 값은 말안해도 다 아실듯 합니다. 전달하고자 하는 내용을 문자열 타입으로 생성해주시면 됩니다.


 마지막으로 duration은 toast메시지가 얼마나 떠있다가 사라질 것인지 정해주는 인자입니다. Toast클래스에서 제공하는 LENGTH_LONG과 LENGTH_SHORT를 사용하시면 됩니다. LONG의 경우 3.5초, SHORT는 2초로 설정되어 있다고 합니다.

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds



2. toast의 색상 및 위치 변경 & Inflation

 이러한 toast의 이미지나 위치 크기등을 조절할 수 없다면 너무 재미없겠지요 ㅎㅎ

안드로이드에서는 이미지나 모양,색상 등을 대부분 res에 존재하는 drawable폴더에서 설정하게 됩니다.

아래 코드에서 상단에 shape로 지정해주면 Shape Drawable 객체를 xml로 쉽게 생성하여 사용하는 것입니다.

비트맵을 사용하지 않아도 되어서 apk의 용량도 줄여주고 모양 변경에 용이하다 하네요 ㅎ.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:color="#ffffff00"
android:width="4dp"/>
<solid
android:color="#ff883300"/>
<corners
android:radius="15dp"/>
<padding
android:bottom="20dp"
android:left="20dp"
android:right="20dp"
android:top="20dp"/>

</shape>

저는 다음과 같이 설정하였습니다. 엄청 안이쁩니다... 대충한거라...


- shape :

     도양의 모형입니다! 속성으로는 retangle(사각형), oval(타원), line(선), ring(링) 4개의 값을 지정할 수 있습니다.

     이 때 각 속성에 따른 추가적인 속성이 다르기 때문에 저는 retangle를 사용하여 보여드리겠습니다.

- stroke : 선을 그리거나 테두리를 그릴때 사용됩니다! 추가 속성으로는 dashGap(점선의 경우 점선 간격), dashWidth(점선의 크기)가 있습니다.

- solid : 모양의 색을 결정하는 속성입니다!

- corners : 

    가장자리의 모양을 설정하는 속성으로 radius로 설정합니다.

    radius은 rectangle에서만 사용되는 속성인데 왜 반지름을 뜻하는 radius가 rectangle에서만 사용되냐면 가장자리의 모서리를 둥글게 하기위해 반지름을 이용하        여 둥글게 만드는 것 같습니다!

     topLeftRadius / topRightRadius / bottomLeftRadius / bottomRightRadius 이 형태로 각 부분을 다르게 설정할 수 도 있습니다.

- padding : 

     Layout을 디자인?할 때도 많이 보이는 속성입니다. 이 padding 값은 shape에 지정되는 형태가 아니라 shape를 포함하고 있는 View에 설정되는 값입니다.


위와 같은 rectangle 형태의 drawable 작업이 끝나면 MainActivity에서 버튼과 drawable객체를 이용하여 작동시켜주면 되겠죠!?

Button button2 =(Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toastborder,(ViewGroup)findViewById(R.id.toast_layout_root));
TextView textView = (TextView) layout.findViewById(R.id.textView);
textView.setText("토스트 모앙 바꿈");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER, 0, -100);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
}
});


LayoutInflater, inflate 이런 단어가 많이 보이는데 사실 inflater는 안드로이드에서 가장 중요한 부분인 것 같습니다.

기회가 된다면 따로 inflater주제로 글을 작성하겠습니다.

 간략히만 아는대로 설명해보겠습니다.!!!


우리가 xml 레이아웃 파일에서 작성한 text가 디자인으로 나타나는 것을 볼 수 있습니다. 실제로 이 과정을 inflation이라 부르는 것 같습니다.


이 과정을 자세히보면 xml 레이아웃 파일의 내용을 자바 소스 코드에서 사용하려면 앱이 실행될 때 xml 레이아웃 파일의 내용이 메모리로 로딩되어 객체화되어야 합니다. 이렇게 xml 레이아웃에 정의된 내용이 메모리에 로딩된 후 객체화되는 과정을 인플레이션이라고 합니다!!


이렇게 프로젝트를 생성하면 기본적으로 생성되는 activity_main.xml은 MainActivity에서 setContentViuew()메소드에 의해 자동적으로 인플레이션되게 작성되어 있습니다. 


위 코드를 보면 getLayoutInflater() 이 부분에서 레이아웃 인플레이션 객체를 참조하고 이 때 만들어진 객체를 이용하여 inflate()를 이용해 toast를 위한 레이아웃 인플레이션을 생성하는 것입니다.  이 과정이 필요한 이유는 우리가 toast의 drawable을 임의적으로 생성하여 toast를 위한 레이아웃을 생성한다면 이 레이아웃은 액티비티를 위한 것이 아니기 때문에 사용자가 직접 inflation 해줘야하기 때문에 안드로이드에서는 이 부분이 매우 중요한것 같습니다!


이러한 toast를 꾸미기 위한 toast.xml이 완성되었다면 이것을 이용해 Layout에 적용시켜줘야겠죠??

저는 간단히 LinearLayout에 TextView를 추가하였고 TextView의 백그라운드를 우리가 만든 drawable 폴더에 있는 toast.xml로 지정하면 됩니다.

android:background="@drawable/toast" 

이렇게 생성된 레이아웃을 toastborder.xml이라면 이 안에 만든 LinearLayout의 id를 지정하여 toast를 위한 레이아웃 인플레이션해주면 됩니다.

이에 layout을 이용하여 textView에 뿌려질 text를 지정해주고 toast객체를 생성하여 위치를 결정할 수 있는 것 입니다.


여기까지한다면 toast가 어떤 layout에 뿌려질 것인가 결정해 주어야 합니다!

그러기 위해 존재하는 메소드가 setView()메소드로 인자로 토스트가 보이는 뷰를 넘겨주면 됩니다!



전 다음과 같이 결과물이 나오네요 ㅎㅎ 엄청 이상하죠 


정리를 해본다면 

toast 이미지 결정을 위한 drawable 객체 생성 -> 이 객체를 담을 textView를 가진 layout 생성 

-> toast를 위한 레이아웃 인플레이션 -> 토스트가 보이는 뷰 설정

이거 같습니다!!


제가 잘 이해한지 모르겠네요 ㅠㅠ 사실 Toast라 몇 줄쓰면 끝날 줄 알았는데 내용이 줄줄이 이어지네요...


'Android' 카테고리의 다른 글

5. Page Sliding  (0) 2018.09.30
4. Tween Animation  (0) 2018.09.29
3. 액티비티의 수명주기 : Life Cycle  (0) 2018.09.27
2. Event : Touch, Gesture, Key  (0) 2018.09.25
Android Programming 프롤로그  (0) 2018.09.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함