잠깐 보이고 사라지는 것
토스트는 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를 상속 받아서 만듦
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!!");
}
});
}
});
}
}
아이콘 알림, 인텐드를 배워야 할 수 잇음
알림음
안드로이드에선 소리제어 2가지 있음
1) Media Player: 뮤직, 배경음악 등 긴 음 쓸때
2) SoundPool : 효과음, 9초 이내 짧은 음 , 긴음악은 플레이 안됨
사운드풀에 음악을 등록해 놓는다 등록하면 자동으로 id를 만든다 -> 이때 id를 보관해놔야함
id를 불러 play를 한다
res 폴더에 sound 폴더 추가하기
<?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>
① 사운드풀 객체를 만들어서 음원들을 등록
사운드 풀을 만들어주는 건축가 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);
}
});
}
}