본문 바로가기

Dev/안드로이드

Do it! 안드로이드 앱 프로그래밍 토스트 메시지 위치 바꾸기

728x90
반응형

오늘은 Do it! 안드로이드 앱 프로그래밍 개정 7판 p.217~220 사이에 있는

토스트 메시지의 위치를 바꾸는 실습을 해봤습니다.

 

앱을 실행하고 결과가 제대로 나오지 않았는데요.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/editText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="X 위치"
            android:textSize="20sp"
            android:inputType="numberSigned"/>

        <EditText
            android:id="@+id/editText2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:inputType="numberSigned"
            android:hint="Y 위치" />

        <Button
            android:id="@+id/button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="띄우기"
            android:textSize="20sp"
            android:onClick="onButton1Clicked" />
    </LinearLayout>
</LinearLayout>

xml 파일에서의 문제는 없었습니다.

 

문제가 되는 MainActivity.java입니다.

package com.example.sampletoast;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    EditText editText;
    EditText editText2;

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

        editText = findViewById(R.id.editText);
        editText2 = findViewById(R.id.editText2);
    }

    public void onButton1Clicked(View v) {
        try {
            Toast toastView = Toast.makeText(this, "위치가 바뀐 토스트 메시지입니다.", Toast.LENGTH_LONG);
            int xOffset = Integer.parseInt(editText.getText().toString());
            int yOffset = Integer.parseInt(editText2.getText().toString());

            toastView.setGravity(Gravity.TOP|Gravity.TOP, xOffset, yOffset);
            toastView.show();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
}

문법적인 오류는 없습니다.

다만, AVD를 통해 실행해서 두 개의 editText에 값을 넣고 버튼을 눌러

토스트 메시지를 출력하면 토스트 메시지의 위치가 바뀌지 않았습니다.

 

그 이유는 디버거에서 찾을 수 있었습니다.

이러한 에러 메시지가 출력이 되었는데요. 그대로 직역하면 text 토스트에서 setGravity()가 호출되지 않아야 한다.

사용되지 않을 것이다 라고 보여지죠.

 

저는 그래서 다른 방법을 하나 시도해 보기로 했습니다.

단순히,

이 문장에서 text:"위치가 바뀐 토스트 메시지입니다." 라고 보이는 부분을 바꾸면 어떨까.

 

그래서 바로 위에 문장을 하나 추가했습니다.

String text1 = "위치가 바뀐 토스트 메시지입니다.";

 

그리고 this, text1, Toast.LENGTH_LONG 으로 바꿔서 실행을 해봤죠.

 

E/Toast: setGravity() shouldn't be called on text toasts, the values won't be used

 

결과는 위와 같은 에러 메시지만을 보여주었습니다...

 

그래서 stackoverflow에도 검색을 해봤지만 알 수가 없었습니다.

 

그런데, 정확한 해답은 developers.android.com에서 검색해볼 수 있었습니다.

Warning에 보시면 this method is a no-op when called on text toasts.라고 되어있습니다.

 

무조건 텍스트 토스트는 그럴까??라는 생각이 들어 앞 문장도 다시 읽어보았는데요.

 

안드로이드 빌드 버전 코드가 R이거나 이상인 앱에서

이 메소드가 텍스트 토스트에 동작하지 않는다는 것을 볼 수 있습니다.

 

빌드 버전 코드 R은 또 뭐야.. 라고 생각해서 파란 글씨를 또 눌러봤습니다.

빌드 버전 R은 안드로이드 API 30을 의미하는 것입니다.

 

아니, 그럼 안드로이드 버전 10(API 29)에서는 된다는 말 아닌가?

그래서 에뮬레이터를 안드로이드 10버전으로 새로 만들어서 실행해보았습니다.

이런 식으로 작동이 아주 잘 됩니다.

 

책에서는 어떻게 실행을 했는지 잘 모르겠네요.

 

책에서도 안드로이드 11버전으로 실행했던 것으로 봤는데 책이 출간되고 나서 문법이 바뀐건지는 잘 모르겠습니다.

 

이 글을 보시고 문제가 해결되셨다면 너무나 축하드립니다.

 

긴 글을 읽어주셔서 감사합니다. 좋은 하루 되세요.

 

위 링크를 통해 구매 시, 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

728x90
반응형

"); wcs_do();