사용자의 알림

소정·2023년 2월 14일
0

Android_with_Java

목록 보기
7/34

[1] Toast

잠깐 보이고 사라지는 것
토스트는 view하고 상관없이 떠있음

<?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/tstBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="show toast"/>

</LinearLayout>

package com.bsj0420.ex14toastdialog;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button tstBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tstBtn = findViewById(R.id.tstBtn);

        //this : class를 부르는 애
        
        tstBtn.setOnClickListener(new View.OnClickListener() { //익명클래스(이너 클래스)
            @Override
            public void onClick(View view) {
                // 1. 토스트 객체 만들기
                // 토스트는 new 로 객체 생성 없이 static 메소드로 만들어둠
                Toast ts = Toast.makeText(MainActivity.this, "hello toast", Toast.LENGTH_LONG);
                //Toast.LENGTH_SHORT 짧게 3초 이내  Toast.LENGTH_LONG 길게 5초 이내

                ts.show();

            }
        });
    }
}



매개 변수 살펴보기

Context context : OS(Android)의 대리인 운영체제와 대화하기 위해 대신 하는 애
CharSequence : 한문자가 여러게 있다라는 뜻 : 문자열 (Stirng클레스의 전신)
Duration : 얼마나 오래 보여줄것인지

💡 Context란?

운영체제 : 하드웨어를 제어하는 소프트웨들의 집합 윈도우는 windows/ 핸드폰은 Android

  • 내가 앱을 만든다는 것은 운영체제한테 부탁하는 것
    하드웨어를 내가 직접 제어 하는 것이 아니고 OS한테 요청하는것
  • 운영체제는 건드리지 못함 대신 운영체제의 권한을 부여받은 애 Context 에게 부탁함
  • Context 은 여러 마리 가능
  • Context 객체는 부품별로 작업하는 애들이 따로 있음
    소리 내는 애 - 오디오 매니저
    창 띄우는 애 - 윈도우매니저 등등 담당자들이 따로 있음
    Resouce도 context안에 있는 애중 한마리였음


    📢 Context 부르는 방법
    Context 는 new 로 가져올 수 없음
    Activity 자체가 운영체제 능력을 갖도록 만듦 Context를 상속 받아서 만듦

[2] Dialog

  • 사용자 대화상자, 한번 더 물어보는 것 예스 노 선택

다이아로그 생성 방법

  1. alert dialog 를 만들어주는 건축가(Builder) 객체를 생성 (=> 빌더패턴)
  2. 건축가(Builder)에게 원하는 모양 의뢰(설정)
  3. 설정한 대로 다이아로그 만들어달라(.create())고 요청
  4. 화면에 보여주기(.show())
package com.bsj0420.ex14toastdialog;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button tstBtn;

    Button dlBtn;

    //다이어로그가 보여줄 목록 항목들
    String[] items = {"APPLE", "BANANA", "ORANGE"};

    //3.
    int selectedItemIndex = 1;

    //4.
    boolean[] checkedItems = {true,false,true}; //위에 설정한 아이템과 1:1로 맞아야함


    //5.
    TextView dialogTxt;
    Button dialogBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //2. 다이아 로그
        dlBtn = findViewById(R.id.dlBtn);
        dlBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1. alert dialog 를 만들어주는 건축가(Bilder) 객체를 생성
                //알럿버튼은 최대 3개까지만 만들 수 있다
                //버튼마다 이름도 있음
                //positiveBtn / NegativeBtn / NeutralButton

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                //2. 건축가에게 원하는 모양 의뢰(설정)
                builder.setTitle("알럿연습");
                builder.setIcon(R.drawable.baseline_brightness_2_24);

                //setMessage는 기본 textView
                //1) 단순메세지 하나 보여줄때
                //builder.setMessage("나가시겠습니까?");

                //2) 목록으로 항목들 보여줄때
                //목록을 자체가 눌러짐 버튼 안만듦
//                builder.setItems(items, new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i) {
//                        //두번쨰 파라미터 i 가 클릭한 항목의 인덱스번호 : 0~i
//                        Toast.makeText(MainActivity.this, items[i] , Toast.LENGTH_SHORT).show();
//                        //makeText인데 i는 int라 오류 String으로 변환해준다
//                    }
//                });

                //3) 싱글초이스 (라디오버튼) 항목 보여줄때
                // checkedItem = 미리 선택 해둘 index번호
//                builder.setSingleChoiceItems(items, selectedItemIndex, new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i) {
//                        selectedItemIndex = i;
//                    }
//                });
//
//                builder.setPositiveButton("네", new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i) {
//                        //싱클초이스를 통해 선책한 아이템 문자열 출력해보기
//                        Toast.makeText(MainActivity.this, "선택한 것 : " + items[selectedItemIndex],Toast.LENGTH_SHORT).show();
//                    }
//                });
                
                
                //4) 멀티 초이스 항목들 보여줄때 OnMultiChoiceClickListener
//                builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i, boolean b) {
//                        // int i = 클릭된 항목의 index번호
//                        // boolean b = 클릭된 항목의 true false값 여부 (누르긴 눌렀는데 on인지 off인지 알려고)
//
//                        checkedItems[i] = b;
//                    }
//                });
//
//                builder.setPositiveButton("네", new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i) {
//                        String s= "";
//
//                        for(int j=0; j < checkedItems.length; j++){
//                            if(checkedItems[j]) s+= items[j];
//                        }
//
//                        Toast.makeText(MainActivity.this, "items: " + s ,Toast.LENGTH_SHORT).show();
//
//                    }
//                });
                
                
                //5) 커스텀 뷰 보여주기
                //직접 자바로 뷰들을 만들어서 실행하면 코드가 지저분
                // xml 언어로 뷰를 설계하면 편하게 적용가능함
                // res폴더 안에 layout 폴더 안에 dialog의 커스텀뷰 모양 설계
                builder.setView(R.layout.my_dialog);
                
                //커스텀 버튼 누르면 텍스트 변경
                //맨 밑에 다이아로그 생성 후 붙여야함


                //기본 버튼
//                builder.setPositiveButton("네", new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialogInterface, int i) {
//                        Toast t = Toast.makeText(MainActivity.this,"ok",Toast.LENGTH_SHORT);
//                        t.show();
//                    }
//                });
                // DialogInterface.OnClickListener 
                //다이아로그 전용 리스너 암것도 안써도 다이아로그 닫아줌

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

                //3. 설정한 대로 다이아로그 만들어달라고 요청
                //이때 다이아 로그 만든것
                AlertDialog dialog =builder.create(); 
                
                //다이아로그에 바깥쪽을 클릭해도 없어지지(취소)않도록 성정
                dialog.setCanceledOnTouchOutside(false);

                //다이아로그버튼이 아니면 어떠한방법으로도 못끄게 만들기
                dialog.setCancelable(false);

                //4. 화면에 보여주기
                dialog.show();
                
                //다이아 로그 안에 있는 커스텀뷰의 뷰들을 찾아서 제어하기
                dialogTxt = dialog.findViewById(R.id.dialog_txt);
                dialogBtn = dialog.findViewById(R.id.dialog_btn);

                dialogBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        dialogTxt.setText("Good!!");
                    }
                });

            }
        });
        
    }
}

1. 다이아로그 기본

2. 라디오버튼 다이아로그

3. 체크박스 다이아로그

4. 커스텀 다이아로그

[3] Notification(추후에)

아이콘 알림, 인텐드를 배워야 할 수 잇음

[4] 소리

알림음

안드로이드에선 소리제어 2가지 있음
1) Media Player: 뮤직, 배경음악 등 긴 음 쓸때

2) SoundPool : 효과음, 9초 이내 짧은 음 , 긴음악은 플레이 안됨
사운드풀에 음악을 등록해 놓는다 등록하면 자동으로 id를 만든다 -> 이때 id를 보관해놔야함
id를 불러 play를 한다


res 폴더에 sound 폴더 추가하기

화면 예제

layout

<?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="wrap_content"
        android:layout_height="wrap_content"
        android:text="START"/>
    <Button
        android:id="@+id/btn02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="again"
        android:backgroundTint="@color/black"/>
    <Button
        android:id="@+id/btn03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="good job"
        android:backgroundTint="@color/teal_700"/>

    <Button
        android:id="@+id/btn04"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="긴 음원 플레이"
        android:backgroundTint="#FF8800"/>

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/circle_iv"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:background="@android:color/transparent"
        app:civ_border_overlay="true"
        app:civ_border_width="5dp"
        app:civ_border_color="#000000"
        android:src="@drawable/ic_launcher_foreground"
        />


</LinearLayout>

.java

① 사운드풀 객체를 만들어서 음원들을 등록
사운드 풀을 만들어주는 건축가 Bulider 객체를 활용
② 음원 아이디 저장용 변수 만들기
음원 개수만큼 사운드 변수 만들어줘야함 (소리:변수 = 1:1)

package com.bsj0420.ex15soundpool;

import androidx.appcompat.app.AppCompatActivity;

import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button btn01, btn02, btn03, btn04;

    SoundPool sp;

    //2.
    int sdStart, sdAgain, sdGoodJob; //음원 ID 저장용 변수
    int sdMusic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //1. 사운드풀 객체를 만들어서 음원들을 등록
        // 사운드풀을 만들어주는 건축가(Builder) 객체를 활용
        SoundPool.Builder builder= new SoundPool.Builder();
        builder.setMaxStreams(10); //한번에 플레이 가능한 음원 수 - 우선순위가 낮은 음원은 안들림
        // **우선순위**에 따라 10개 까지
        sp= builder.build();

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

        sdMusic= sp.load(this, R.raw.kalimba, 0); //긴 음원

        //2. 음원 아이디 저장용 변수 만들기
        //음원 개수만큼 사운드 변수 만들어줘야함 (소리:변수 = 1:1)
        btn01= findViewById(R.id.btn01);
        btn02= findViewById(R.id.btn02);
        btn03= findViewById(R.id.btn03);
        btn04= findViewById(R.id.btn04);

        //priority : 우선순위 10에 가까울 수록 중요
        //loop : 반복수 -1은 무한 반복인데 어차피 9초이상 안나옴
        //rat : 배속 (0.5f ~ 1.0f)
        btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.play(sdStart, 0.9f, 0.9f, 3, 0, 1.0f);
            }
        });

        btn02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.play(sdAgain, 0.8f, 0.8f, 2, 0, 1.0f);
            }
        });

        btn03.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.play(sdGoodJob, 1, 1, 1, 0, 1.0f);
            }
        });

        btn04.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.play(sdMusic, 0.7f, 0.7f, 5, 0, 1.0f);
            }
        });

    }
}

[5] 진동 (추후에)

profile
보조기억장치

0개의 댓글