오늘은 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버전으로 실행했던 것으로 봤는데 책이 출간되고 나서 문법이 바뀐건지는 잘 모르겠습니다.
이 글을 보시고 문제가 해결되셨다면 너무나 축하드립니다.
긴 글을 읽어주셔서 감사합니다. 좋은 하루 되세요.
위 링크를 통해 구매 시, 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Dev > 안드로이드' 카테고리의 다른 글
Do it! 안드로이드 앱 프로그래밍 개정 7판 위험 권한 자동 부여 (0) | 2021.06.03 |
---|---|
Do it! 안드로이드 앱 프로그래밍 개정 7판 상단 탭 보여주기 예제 (0) | 2021.05.26 |
Do it! 안드로이드 앱 프로그래밍 프레임 레이아웃과 뷰의 전환 (0) | 2021.04.25 |
안드로이드 프로그래밍 8장 실습 8-1 (0) | 2020.06.22 |
안드로이드 프로그래밍 7장 직접 풀어보기 7-1 (2) | 2020.05.30 |