최종 결과물

문자열 입력받아서 '전송' 버튼을 누르면 해당 문자열이 토스트로 표시됨. 입력상자 하단에는 입력한 글자의 길이가 표시됨.

 

 

과정

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로 설정했다.)

 

 

[Android] 안드로이드 - 에디트텍스트(EditText) 사용법 정리

안드로이드 에디트텍스트(EditText)는 TextView로부터 파생된 클래스로 TextView는 단순히 Text를 보여주는 역할을 한다면 EditText는 Text를 입력 및 수정까지 가능한 뷰(View) 위젯입니다. 1. EditText 기본 사

lktprogrammer.tistory.com

 

2. 전송 버튼 구현

editText로 받아온 문자열을 Toast.makeText()에 넣었다.

여기서 그냥 editText로 넣었더니 에러가 떠서, editText.getText()로 바꾸어주었더니 해결되었다.

(참고한 블로그 : 목차 1의 링크랑 동일)

 

참고로 닫기 버튼은 아무 기능이 없다.(책에서 넣으라길래 넣음)

 

3. 글자 크기 표시

일단 기본적으로 "0 / 8 글자"가 표시되도록 설정했다.

 

그 다음 (1) 입력될 때마다 (2) 입력받은 text의 길이를 출력해야 했다.

 

(1) 먼저 입력될 때마다,를 어떻게 인식하는지를 찾아보았다.

처음에 찾은 블로그이다. 참고하려고 했는데 언어가 코틀린이었다.

 

안드로이드[Android] EditText 입력 글자수 제한, 표기 / 문장수 제한

위로 프로젝트를 진행하면서 게시글이 적힐 때 글자수 제한과 입력받은 글자수를 표시하고 싶어서..! 기능을 구현해보았습니다. 요런식으로 입력 받은 글자수 6/2000를 표시하고 2000자가 넘어가

soopeach.tistory.com

그치만 이 글도 도움이 되었다. java로 addTextChangedListener를 작성하면 되겠다는 생각이 들어서 검색해봤다.

 

다음으로 찾은 글이다.

 

[안드로이드 스튜디오] TextWatcher (JAVA/자바)

안녕하세요~ 코딩하는 코알못 코메인입니다. 이번에는 TextWatcher를 사용하는 법을 알아보겠다. TextWatcher는 실시간으로 추가적인 조치 없이 EditText에 입력한 값을 읽어서 바로 적용하게 해주는 인

comain.tistory.com

이 글에 따르면 아래 코드를 입력할 시 알아서 beforeTextChanged(입력전), onTextChanged(입력중), afterTextChanged(입력후) 총 3가지의 메소드가 자동으로 나타난다고 했다.

editText.addTextChangedListener(new TextWatcher()

 

그래서 입력했는데 메소드는 출력되지 않고 에러가 발생하는 것이다. 

검색해봤더니 답은 간단했다.

 

Cannot Resolve addTextChangedListener Symbol Android

String x; double z,y; EditText first; EditText second; EditText result; EditText Et = (EditText) findViewById(R.id.ch1); Et.addTextChangedListener(new TextWatcher() { public void onTextChanged(...

stackoverflow.com

이 사이트에서 나처럼 한 사람이 있었다.

onCreate 안에다 입력을 해야하는데 밖에다 입력한 것이다. 안에 입력했더니 정상적으로 메소드가 나타났다.

 

입력되는 중에 text가 바뀌어야하는 것이기 때문에 onTextChanged 메소드에 코드를 작성했다.

 

(2) 그 다음으로 입력받은 text의 길이 출력하기

처음에 textView.setText(i1+" / 8글자")로 입력했는데 출력이 뭔가 이상해서 i1 대신 i랑 i2도 넣어봤지만 여전히 이상했다.

그냥 editText.length()를 넣어주면 되는 것이었다.

 

4. 문제 해결 - AVD 앱 실행 에러

완벽히 되는 것 같았으나.. AVD 실행 시 에러가 뜨는 거다. 일단 내가 예전에 작성한대로 해보았다.

https://sand-to-desert.tistory.com/53

이걸로 AVD가 terminated 되는 상태는 없어졌는데, 앱이 실행이 안되는 거다.

 

에러가 뜨는 것도 아니라서 어떻게 해결하나 생각했는데 logcat을 보았더니 아래와 같이 FATAL EXEPTION이 떠있었다.

 

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{...}를 검색해보았다.

이 에러는 Activity 시작 시 UI 화면을 로드할 수 없는 경우에 발생한다고 한다.

 

이 에러가 뜨는 여러 원인이 있는데 그 중 아래 사진과 동일한 상황으로 보였다.

setContentView() 이전에 초기화를 하면 에러가 날 수 있다고 한다.

그래서 아래와 같이 setContentView() 이후에 초기화하는 코드로 변경했다.

 

 

[에러] java.lang.RuntimeException: Unable to instantiate activity ComponentInfo {...}

에러 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo {com.example.tripplanner/com.example.tripplanner.LoginActivity}: java.lang.ClassNotFoundException... 이 에러는 Activity 시작 시 UI 화면을 로드할 수 없는 경우

webit22.tistory.com

 

<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();
    }
}

 

 

구현하는 것도 꽤 머리아프지만 역시 구현이 끝난 후 이렇게 한번 싹 정리해서 기록하는 것이 참 귀찮다.

그치만... 이전엔 이렇게 안했더니 내 머릿속엔 든게 없지.

바보자식