최종 결과물
문자열 입력받아서 '전송' 버튼을 누르면 해당 문자열이 토스트로 표시됨. 입력상자 하단에는 입력한 글자의 길이가 표시됨.
과정
1. 레이아웃 만들기 - 입력상자 구현(editText)
2. 전송 버튼 구현(입력한 text 토스트 표시)
3. 글자 크기 표시(addTextChangedListener로 즉각 표시)
4. 문제 해결 - AVD 앱 실행 에러(java.lang.RuntimeException)
+ XML, JAVA 코드
1. 레이아웃 만들기
아래와 같이 LinearLayout 3개를 9:1:2 비율로 배치했다.
첫번째 레이아웃 안에 Plain Text를 드래그해서 넣어주었다. (Text에서 TextView를 제외한 아래에 있는 항목들은 거의 밑줄이 쳐져있는 아이콘인데, 모두 입력을 받는 EditText인 듯 하다.)
android:text는 입력 시 해당 text가 입력상자 안에 실제로 있는 것이다.
android:hint는 입력 상자를 누르면 해당 text는 사라진다.
android:maxLength로 입력받을 text의 길이를 8로 제한했다. (8로 설정하면 될 줄 알았는데 왜인진 모르겠으나 글자 수를 7글자까지만 입력가능하길래 그냥 9로 설정했다.)
2. 전송 버튼 구현
editText로 받아온 문자열을 Toast.makeText()에 넣었다.
여기서 그냥 editText로 넣었더니 에러가 떠서, editText.getText()로 바꾸어주었더니 해결되었다.
(참고한 블로그 : 목차 1의 링크랑 동일)
참고로 닫기 버튼은 아무 기능이 없다.(책에서 넣으라길래 넣음)
3. 글자 크기 표시
일단 기본적으로 "0 / 8 글자"가 표시되도록 설정했다.
그 다음 (1) 입력될 때마다 (2) 입력받은 text의 길이를 출력해야 했다.
(1) 먼저 입력될 때마다,를 어떻게 인식하는지를 찾아보았다.
처음에 찾은 블로그이다. 참고하려고 했는데 언어가 코틀린이었다.
그치만 이 글도 도움이 되었다. java로 addTextChangedListener를 작성하면 되겠다는 생각이 들어서 검색해봤다.
다음으로 찾은 글이다.
이 글에 따르면 아래 코드를 입력할 시 알아서 beforeTextChanged(입력전), onTextChanged(입력중), afterTextChanged(입력후) 총 3가지의 메소드가 자동으로 나타난다고 했다.
editText.addTextChangedListener(new TextWatcher()
그래서 입력했는데 메소드는 출력되지 않고 에러가 발생하는 것이다.
검색해봤더니 답은 간단했다.
이 사이트에서 나처럼 한 사람이 있었다.
onCreate 안에다 입력을 해야하는데 밖에다 입력한 것이다. 안에 입력했더니 정상적으로 메소드가 나타났다.
입력되는 중에 text가 바뀌어야하는 것이기 때문에 onTextChanged 메소드에 코드를 작성했다.
(2) 그 다음으로 입력받은 text의 길이 출력하기
처음에 textView.setText(i1+" / 8글자")로 입력했는데 출력이 뭔가 이상해서 i1 대신 i랑 i2도 넣어봤지만 여전히 이상했다.
그냥 editText.length()를 넣어주면 되는 것이었다.
4. 문제 해결 - AVD 앱 실행 에러
완벽히 되는 것 같았으나.. AVD 실행 시 에러가 뜨는 거다. 일단 내가 예전에 작성한대로 해보았다.
이걸로 AVD가 terminated 되는 상태는 없어졌는데, 앱이 실행이 안되는 거다.
에러가 뜨는 것도 아니라서 어떻게 해결하나 생각했는데 logcat을 보았더니 아래와 같이 FATAL EXEPTION이 떠있었다.
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{...}를 검색해보았다.
이 에러는 Activity 시작 시 UI 화면을 로드할 수 없는 경우에 발생한다고 한다.
이 에러가 뜨는 여러 원인이 있는데 그 중 아래 사진과 동일한 상황으로 보였다.
setContentView() 이전에 초기화를 하면 에러가 날 수 있다고 한다.
그래서 아래와 같이 setContentView() 이후에 초기화하는 코드로 변경했다.
<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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="12"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="18dp"
android:layout_weight="9"
android:background="#000000"
android:orientation="horizontal"
android:padding="2dp">
<EditText
android:id="@+id/editTextText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:ems="10"
android:gravity="center"
android:inputType="text"
android:hint="입력상자"
android:maxLength="9"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="right"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="25dp"
android:text="0 / 8 글자"
android:textColor="#323232"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:onClick="Button_send"
android:text="전송" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:text="닫기" />
</LinearLayout>
</LinearLayout>
<JAVA>
public class MainActivity extends AppCompatActivity {
EditText editText;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editTextText);
textView = findViewById(R.id.textView);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
textView.setText(editText.length()+" / 8 글자");
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
public void Button_send(View V){
Toast.makeText(this,editText.getText(),Toast.LENGTH_LONG).show();
}
}
구현하는 것도 꽤 머리아프지만 역시 구현이 끝난 후 이렇게 한번 싹 정리해서 기록하는 것이 참 귀찮다.
그치만... 이전엔 이렇게 안했더니 내 머릿속엔 든게 없지.
바보자식
'TIL > 안드로이드 스튜디오' 카테고리의 다른 글
3장 드로어블 (0) | 2024.11.22 |
---|---|
3장 기본 위젯 (0) | 2024.11.20 |
도전!3 - 두 개의 이미지뷰에 이미지 번갈아 보여주기 (0) | 2024.11.18 |
2장 레이아웃 (0) | 2024.11.15 |
1장 기초 맛보기 - Intent, Action, URI, 단축키, 뷰, 제약조건 ... (0) | 2024.11.11 |