EditText / 사용자 알림

Hue·2023년 2월 14일
0

Android/Kotlin

목록 보기
5/42

⌨ EditText

  • 힌트, 소프트 키보드 타입
    hint : 입력할 내용을 알려줌, 입력시작하면 사라짐
    textColorHint : 힌트 텍스트 색 변경
    inputType : 한 줄짜리 입력을 받을 때 입력받는 종류 선택 가능

  • 여러 줄 입력
    inputType = textMultiLine
    lines = "3" 줄 사이즈 정할 수 있음, 넘어가면 스크롤
    maxLines = "3" 줄이 넘어가면 더이상 커지지않음

  • 글자수만큼 뷰의 너비 지정 : ems

  • EditText에 아이콘 이미지 지정 : drawableRight

  • background 색을 주면 밑줄 사라짐

  • vector image 그리기
    res > drawable > new > Drawable Resource File
    (stroke / solid / corners)

🔍 글자수가 넘어가면 다음 칸으로 넘기기 (휴대폰번호 입력)
--> 게시판 글 넘어가면 ... 으로 생략 등에 사용될 수 있음

et01.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) {
                //CharSequence = String의 부모
                //글자 수가 3글자인지 확인
                if (charSequence.length() >= 3) et02.requestFocus();}

            @Override
            public void afterTextChanged(Editable editable) {}
});

🔔 사용자 알림

Activity와 별도, View 아님

(Toast, Dialog, Notification = 시각적 알림)

ⓐ Toast

Toast.makeText(Context context, CharSequence text, int duration)

✔ Context
운영체제(OS) = 소프트웨어의 집합, 하드웨어를 제어
휴대폰전용 운영체제가 필요 --> Android OS
APP은 운영체제 위에서 실행됨(운영체제와 소통필요), 하드웨어를 직접 제어불가
운영체제에게 요청해야함!
BUT, 운영체제를 직접 건들이는것은 위험하기때문에 App의 접근제한
Context에게 위임장을 줌 (App마다 Context가 따로 있고, 권한이 조금씩 다름)
⭐ Context : 운영체제(OS)의 대리인 객체
안드로이드 운영체제의 시스템 APIs를 가지고 있는 class

MainActivity -- 상속 --> Activity (화면을 제어하는 능력) -- 상속 --> Context
MainActivity가 화면을 제어하는 능력 상속받았기때문에 이를 이용

btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast 객체 생성
                //static method : 객체를 생성하지 않고 사용가능
                //익명 class (inner class) this라고 쓸 경우 익명클래스를 지칭
                //MainActivity.this라고 써주어야 함
                Toast t = Toast.makeText(MainActivity.this, "TOAST IS DONE!", Toast.LENGTH_SHORT);
                t.show();
            }
});

ⓑ Dialog

Builder(Context context)

AlertDialog [title(+icon) / Message / Button (N, Positive, Negative --> 0~3개 가능)]

 btn02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //AlertDialog를 만들어주는 건축가 객체(Builder) 생성
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                //건축가에게 원하는 모양을 의뢰(설정)
                builder.setTitle("DIALOG");
                builder.setIcon(R.drawable.baseline_crisis_alert_24);

                builder.setMessage("Do you wanna QUIT?");

                builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { //view용이 아닌 Dialog용 OnClickListener
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show();
                    }
                });

                builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "NO", Toast.LENGTH_SHORT).show();
                    }
                });

                //건축가에게 의뢰(설정)한대로 다이얼로그를 만들어달라고 요청
                AlertDialog dialog = builder.create();

                //다이얼로그의 바깥쪽을 터치했을때 없어지지(cancel) 않도록
                dialog.setCanceledOnTouchOutside(false);
                //다이얼로그 버튼이 아니면 어떤 방법으로도 취소하지 못하도록(TouchOutside 포함되어 있음)
                dialog.setCancelable(false);
                
                //다이얼로그를 화면에 보여주기
                dialog.show();

            }
});

Message --> List / SingleChoice (RadioButton) / multipleChoice (CheckBox) / CustomView (EditText, ImageView, TextView)

  • List (List로 만들때는 Positive / Negative X)

builder.setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //두 번째 파라미터 i = 클릭된 항목의 위치 (인덱스 번호 : 시작 숫자 '0')
                        //makeText(String) --> int i(정수) : 문자열로 변환 필요(i+"")
                        Toast.makeText(MainActivity.this, items[i] , Toast.LENGTH_SHORT).show();
                    }
});
  • Single Choice
    List는 눌렀을때 바로 선택되지만, Single choice는 누르고 나서 poisitive / negative 버튼 필요
builder.setSingleChoiceItems(items, selectedItemPosition, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //i는 지역변수기때문에 PositiveButton에서 클릭된 값을 받을 수 없음
                        //따라서 멤버변수를 만들고 지역변수값을 멤버변수에 담아두기
                        //PositiveButtton에서는 멤버변수 selectedItemPosition 불러서 사용하면됨!
                        selectedItemPosition = i;
                    }
});

builder.setPositiveButton("OKAY", new DialogInterface.OnClickListener() { //view용이 아닌 Dialog용 OnClickListener
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //Single choice를 통해 선택한 아이템 문자열 출력해보기
                        Toast.makeText(MainActivity.this, items[selectedItemPosition], Toast.LENGTH_SHORT).show();
});

  • Multiple Choice
builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                        //두 번째 파라미터 i : 클릭된 항목의 위치 인덱스 번호
                        //세 번째 파라미너 b : 클릭된 항목의 true/false 여부
                        //새로 바뀐 b의 값을 boolean[]에 대입
                        checkedItems[i] = b;
                    }
                });

                builder.setPositiveButton("OKAY", new DialogInterface.OnClickListener() { //view용이 아닌 Dialog용 OnClickListener
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //Multiple choice를 통해 선택된 아이템들의 문자열 출력해보기
                        String s = "";
                        for(int k = 0; k < checkedItems.length; k++){
                            if (checkedItems[k]) s += items[k];
                        }
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
                    }
});
  • Custom View
    java로 직접 View들을 만들어서 설정하면 코드가 어지러움
    xml언어로 View를 설계하면 편하게 적용 가능
    res 폴더 안 layout 폴더 안 dialog.xml파일에 dialog의 커스텀뷰 모양 설계
builder.setView(R.layout.dialog);
<?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"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="show toast"/>

    <Button
        android:id="@+id/btn02"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Show AlertDialog"
        android:textAllCaps="false"
        android:backgroundTint="@color/teal_700"/>

</LinearLayout>
//다이얼로그 안에 있는 Custom View의 뷰들을 찾아서 제어       
//btn02 = findViewById(R.id.btn02); this.(MainActivity) 생략
dialogTv = dialog.findViewById(R.id.dialog_tv);
dialogBtn = dialog.findViewById(R.id.dialog_btn);
dialogBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        dialogTv.setText("Good:)");
                    }
});

ⓒ Notification

ⓓ 소리

  1. MediaPlayer : Music, Video...
  2. SoundPool : 효과음 (9초 이내 짧은음)
//SoundPool 객체를 만들어서 음원들을 등록
//사운드풀을 만들어주는 건축가(Builder) 객체를 활용
SoundPool.Builder builder = new SoundPool.Builder();
builder.setMaxStreams(10); //한 번에 플레이 가능한 음원의 수(등록갯수X) - 갯수가 넘어가면 우선순위가 낮은 음원은 안들림
sp = builder.build();

//음원등록 --> 음원만의 고유 ID 발급받음
sdStart = sp.load(this, R.raw.s_sijak, 0); //priority : 우선순위 - 등록할때는 모두 0 권장, 플레이할때 우선순위 등록

btn01 = findViewById(R.id.btn01);

btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.play(sdStart, 0.7f, 0.7f, 3, 0, 1.0f);
            }
});

ⓔ 진동

0개의 댓글