본문 바로가기

이상/Andrioid

[Android/Kotlin] EditText의 Single or Multiple Line

반응형

여러 예제를 참고하여 메모 앱을 만들어보고 있는데

 

한 줄짜리 텍스트 입력창과 여러 줄짜리 텍스트 입력창이 필요해서 기록한다.

 

 

 

iOS 개발 할 때

 

한 줄 텍스트 입력은 UITextField로,

 

여러 줄 텍스트 입력은 UITextArea로 했었는데 (예외도 있긴 하다)

 

Android에서는 일반적으로 EditText의 속성을 이리저리 바꿔서 처리하는 것 같다.

 

 

EditText

 

메모의 제목은 한 줄, 내용은 여러 줄로 처리하려고 한다.

 

 

layout.xml

 

레이아웃 구성은 contentText를 Multiple Line으로 할 것이기 때문에

 

contentText의 parent ConstraintLayout의 Bottom을 Save버튼의 top으로 지정했다.

 

 

 

1. inputType

EditText의 입력에 대한 속성은 inputType으로 지정할 수 있다.

 

android:inputType

 

하나 또는 여러 속성을 지정할 수 있고 '|'로 구분해주면 된다고 한다.

 

제목은 Single Line이어야 하므로 가장 plain한 text인 text로 지정한다.

 

내용은 Multiple Line이어야 하므로 textMultiLine으로 지정한다.

 

 

 

2. lines or maxLines

EditText의 높이를 제한 하지않으면 무한정으로 늘어나게 되므로

 

lines 또는 maxLines 속성을 이용하여 제한할 수 있다.

 

lines 속성은 텍스트 입력 전에도 지정된 line수만큼 영역이 확보되어

 

line수를 넘어가든 안넘어가든 영역이 지정된만큼 고정되어있는 형태이다.

 

maxLines 속성은 텍스트 입력 전에는 plain한 상태에서 입력이 되면

 

높이가 점점 늘어나 지정된 line수만큼의 영역을 벗어나면 scroll되는 형태이다.

 

lines, maxLines

 

lines 속성으로 지정할 경우에 텍스트가 EditText 영역의 가운데에 위치하게 되는데

 

gravity 속성을 이용하여 원하는 쪽으로 옮겨주면 된다.

 

메모 작성 화면

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_marginTop="16dp">
 
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        app:layout_constraintBottom_toTopOf="@+id/confirmButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
 
        <EditText
            android:id="@+id/titleText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="제목 (Single Line)"
            app:layout_constraintBottom_toTopOf="@+id/contentText"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:inputType="none" />
 
        <EditText
            android:id="@+id/contentText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:hint="내용 (Multi Line)"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/titleText"
            android:inputType="text|textMultiLine"
            android:scrollbars="vertical"
            android:lines="20"
            android:gravity="top|left"/>
 
    </androidx.constraintlayout.widget.ConstraintLayout>
 
    <Button
        android:id="@+id/confirmButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

 

 

참고.

안드로이드의 inputType 문서에 none에 대해 아래와 같이 설명이 돼있다.

 

There is no content type. The text is not editable.

 

그래서 처음에 inputType을 none으로 지정했는데

 

수정도 될 뿐더러 multiLine 입력도 가능했다.

 

stackoverflow에서 그거 버그야라고 하는 사람도 있는 걸로 봐서

 

EditText를 사용할 때는 inputText 속성을 명시적으로 지정해줘야 할 것 같다.

반응형