반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] 다른 앱에서의 activity 사용 & Android Message 본문
반응형
activity
- activity 요소들은 각 다른 activity에서 쓰이더라도 id를 다르게 주는 것이 좋다.
- 여러 액티비티에서 변수 사용 시 정적 멤버 사용 : 하나 딱 만들어서 쓸 거고 언제 어디서든 가져다 쓸 것이기 때문에 사용
- application context : 정적멤버 대신 많이 사용
- activity launcher 는 다른 activity 이동할 때 이동 전 activity 정보 사용 할 때 사용
다른 어플리케이션에서의 activity 사용
- manifest.xml 안에 안드로이드 4대 요소들 등록해야 한다.
- intent 종류
- 명시적 intent : 어떠한 어플리케이션의 어떤 것을 등록할 것인지 직접 등록해주는 것인데 지금은 쓸 수 없음, 보안의 위험이 있어 지금은 개발자가 허용한 activity만 사용 가능
- 암시적 intent : 개발자가 붙여놓은 activity 이름을 알아야 쓸 수 있음
- 1. 다른 어플리케이션에서도 쓸 activity는 intent filter 이용해 등록
<activity
android:name=".ThirdActivity"
android:exported="true">
<intent-filter>
<action android:name="com.test.android45_third_activity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
- 2. 사용 할 어플리케이션 내에서 다른 어플리케이션의 Activity에 붙혀준 이름을 지정하여 Intent를 생성
// val newIntent = Intent("Intent Filter의 Action name")
val newIntent = Intent("com.test.android45_third_activity")
- 3.사용할 어플리케이션 내에서 activity 실행 : startActivity(newIntent)
application 내부 구글 맵 띄우기
- 1.위도 경도 문자열로 만들어 주기 : val address = "geo:37.243243,131.861601"
- geo: 붙여서 위도 경도 작성
- 2.uri 객체로 만들어 주기 : val uri = Uri.parse(address)
- 3.intent 지정 : val newIntent = Intent(Intent.ACTION_VIEW, uri)
- 4.activity 실행 : startActivity(newIntent)
웹브라우저 실행
- 1.웹브라우저 주소 문자열로 만들어 주기 : val address = "http://developer.android.com"
- 2.uri 객체로 만들어 주기 : val uri = Uri.parse(address)
- 3.intent 지정 : val newIntent = Intent(Intent.ACTION_VIEW, uri)
- 4.activity 실행 : startActivity(newIntent)
android Message
toast
- 잠깐 보여줬다가 사라지는 메세지(보여주고 끝)
- 사용자와 상호작용 할 수 없다.
- 어플리케이션의 관계 없이 요청이 온 순서대로 메세지를 보여준다.
- 사라지면 어디서든 확인할 수 없으므로 사용자가 항상 화면을 보고 있는 상황일 때만 사용
- 요즘에는 사용하지 않는다 : android R 버전에서는 toast 보다는 snack bar을 쓰는 것을 권장한다.
- 생성
- 1. Toast 객체를 생성 : val t1 = Toast.makeText(this@MainActivity, "메세지 내용", toast뜨는시간)
- toast 뜨는 시간 : Toast.LENGTH_SHORT
- 2.메세지 사라질 때 동작 행동 코드로 구현(android11부터 가능)
- 1. Toast 객체를 생성 : val t1 = Toast.makeText(this@MainActivity, "메세지 내용", toast뜨는시간)
// 안드로이드 11부터 되므로 버전 분기처리
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
t1.addCallback(object : Toast.Callback() {
override fun onToastShown() {
super.onToastShown()
textView.text = "기본 Toast 메시지가 나타났습니다"
}
override fun onToastHidden() {
super.onToastHidden()
textView.text = "기본 Toast 메시지가 사라졌습니다"
}
})
}
- 메서드
- toast객체.show() : Toast 메세지 띄우기
- toast객체.duration = 시간 : 뜨는 시간(Toast.LENGTH_LONG 등) 설정
- toastBinding.root.setBackgroundResource(레이아웃 종류)
- toast 메세지 배경용으로 쓰라고 주는 이미지 : android.R.drawble.toast_frame
- android.R.drawable.screen_background_dark
snack bar
- ex) 유튜브 음악에서 음악을 보관함 추가 시 아래 쪽에 보관함에 추가 되었다고 뜨는 메세지
- toast가 다르게 바뀐 형태
- 아래에서 위로 메세지가 나왔다가 사라짐
- 버튼 여러 개 배치해서 사용 가능
- 생성
- 1. snack bar 객체 생성 : val snackBar1 = Snackbar.make(snack bar을 관리하는 view, "스낵바 메세지", snackbar뜨는시간)
- snackbar 종류 : Snackbar.LENGTH_SHORT, Snackbar.LENGTH_LONG, Snackbar.LENGTH_INDEFINITE(사라지지 않는 것)
- 2. snackbar의 call back 구현
- snackBar1.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
- // SnackBar가 나타날 때
- override fun onShown(transientBottomBar: Snackbar?) { super.onShown(transientBottomBar) textView.text = "SnackBar가 나타났습니다" }
- / /SnackBar가 사라질때
- override fun onDismissed(transientBottomBar: Snackbar?, event: Int) { super.onDismissed(transientBottomBar, event) textView.text = "SnackBar가 사라졌습니다" }
- })
- snackBar1.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
- 3. snackbar 보여주기 : snackbar객체.show()
- 1. snack bar 객체 생성 : val snackBar1 = Snackbar.make(snack bar을 관리하는 view, "스낵바 메세지", snackbar뜨는시간)
- snackBar 닫기
// snackBar1 변수가 초기화 되어있다면..
if(::snackBar1.isInitialized){
// 현재 스낵바가 보여지고 있는 상태라면.
if(snackBar1.isShown == true){
// 스낵바를 사라지게 한다.
snackBar1.dismiss()
}
}
- 스낵바 여러 개 두고 싶으면 레이아웃으로 만들어서 커스터마이징으로 가능
// 스낵바를 생성한다
val snackBar2 = Snackbar.make(it, "Custom SnackBar", Snackbar.LENGTH_SHORT)
// ViewBinding
val snackbarBinding = SnackbarBinding.inflate(layoutInflater)
// View 설정
snackbarBinding.run {
imageViewSnackBar.setImageResource(R.drawable.img_android)
textViewSnackBar.text = "새로 추가된 View"
textViewSnackBar.setTextColor(Color.WHITE)
}
// SnackBar의 Layout을 추출하여 새로운 뷰를 추가한다.
val snackBarLayout = snackBar2.view as Snackbar.SnackbarLayout
snackBarLayout.addView(snackbarBinding.root)
// SnackBar가 가지고 있는 TextView를 보이지 않게 한다.
val t1 = snackBarLayout.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
t1.visibility = View.INVISIBLE
snackBar2.show()
- 메서드
- snackBar객체.show() : snackBar 메세지 띄우기
- snackBar객체.setTextColor(Color.색상) : 메세지 색상 설정
- snackBar객체.setBackgroundTint(Color.색상) : 배경 색상 설정
- snackBar객체.setAnimationMode(Snackbar.애니메이션종류) : 애니메이션 설정
- ANIMATION_MODE_FADE : 스낵바 기본 애니메이션
- ANIMATION_MODE_SLIDE : 스낵바 자체가 내려가면서 사라짐
- snackBar객체.setAction("액션이름"){실행문} : action 설정
- action은 메세지 오른쪽 끝에 뜬다.
- addAction 메서드 없어서 action은 하나만 둘 수 있다.
dialog
- 현재 activity 위에 뜸
- activity 위에 뜨면 activity가 멈춤
- 종류 여러가지 제공
- 확인 버튼을 눌러야지만 사라지므로 사용자가 반드시 확인해야하는 메세지는 다이얼로그로 뜨게 해야 한다
- 생성
- 1. 다이얼 생성을 위한 객체 생성 : val builder = AlertDialog.Builder(this@MainActivity)
- 2. 타이틀, 메세지, 아이콘 설정
- 3. 버튼 배치(안드로이드 OS에 따라 버튼 위치는 변동 될 수 있다.)
- 커스텀 다이얼로그
val dialogBinding = DialogBinding.inflate(layoutInflater)
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("커스텀 다이얼로그")
builder.setIcon(R.mipmap.ic_launcher)
// 새로운 뷰를 설정한다.
builder.setView(dialogBinding.root)
// 키보드 올라가게 하기
dialogBinding.editTextDialog1.requestFocus()
thread {
SystemClock.sleep(500)
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(dialogBinding.editTextDialog1, 0)
}
builder.setPositiveButton("확인", null)
builder.setNegativeButton("취소", null)
builder.show()
- 메서드
- 다이얼객체.setTitle("타이틀") : 타이틀 설정
- 다이얼객체.setMessage("다이얼로그 메세지") : 메세지 설정
- 다이얼객체.setIcon(R.아이콘image타입.아이콘이름) : 아이콘 설정
- 버튼 배치
- 버튼을 눌렀을 때 닫는 것은 기본적으로 되므로 버튼을 눌렀을 때 다른 동작 배치하고 싶을 경우 리스너 사용
- positive : 예 / Negative : 아니오 혹은 취소 버튼이라고 생각하면 된다.
- 다이얼객체.setPositiveButton("Positive", null)
- 다이얼객체.setPositiveButton("Positive"){ dialogInterface: DialogInterface, i: Int ->
실행문
} - 다이얼객체.setNegativeButton("Negative", null)
- 다이얼객체.setNegativeButton("Negative"){ dialogInterface: DialogInterface, i: Int ->
실행문
} - 다이얼객체.setNeutralButton("Neutral", null)
- 다이얼객체.setNeutralButton("Neutral"){ dialogInterface: DialogInterface, i: Int ->
실행문
}
- 날짜/시간 선택 다이얼로그
// 날짜를 선택하기 위해 사용하는 다이얼로그
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
// 날짜 선택하면 동작할 리스너
val datePickerListener = object : DatePickerDialog.OnDateSetListener{
// 2번째, 3번째, 4번째 : 년, 월, 일
override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {
textView.text = "${p1}년 ${p2}월 ${p3}일"
}
}
val pickerDialog = DatePickerDialog(this@MainActivity, datePickerListener, year, month, day)
pickerDialog.show()
//시간선택
val calendar = Calendar.getInstance()
val hour = calendar.get(Calendar.HOUR)
val minute = calendar.get(Calendar.MINUTE)
val timePickerListener = object : TimePickerDialog.OnTimeSetListener{
// 두 번째 : 시간, 세 번째 : 분
override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
textView.text = "${p1}시 ${p2}분"
}
}
val pickerDialog = TimePickerDialog(this@MainActivity, timePickerListener,
hour, minute, true)
pickerDialog.show()
- 단일 선택
val adapter = ArrayAdapter<String>(
this@MainActivity, android.R.layout.simple_list_item_1, dateList
)
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("리스트 다이얼로그")
builder.setIcon(R.mipmap.ic_launcher)
// 어뎁터를 설정한다.
// 두 번째 매개변수에는 사용자가 선택한 항목의 순서값이 들어온다.
builder.setAdapter(adapter){ dialogInterface: DialogInterface, i: Int ->
textView.text = "선택한 항목 : ${dateList[i]}"
}
builder.setNegativeButton("취소", null)
builder.show()
- 다중 선택
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("다중 선택 리스트 다이얼로그")
// 무엇이 체크되어 있는 지 알기 위한 booleanArray
val boolArray = BooleanArray(dateList.size) { i -> false }
boolArray[0] = true
boolArray[2] = true
boolArray[4] = true
builder.setMultiChoiceItems(dateList, boolArray, null)
builder.setNegativeButton("취소", null)
builder.setPositiveButton("확인", ){ dialogInterface: DialogInterface, i: Int ->
textView.text = ""
// 다이얼로그에서 ListView를 추출한다.
val alertDialog = dialogInterface as AlertDialog
// 현재 체크되어 있는 상태 정보를 추출한다.
val position = alertDialog.listView.checkedItemPositions
// 위에서 반환된 객체에는 체크 되어 있는 것과 체크 상태가 변경된 것들의 정보만 담겨져있다.
// {순서값=체크여부}
for(idx in 0 until position.size()){
// 현재 항목의 위치값을 가져온다.
val pos1 = position.keyAt(idx)
// 현재 번째 배열에 값을 넣어준다.
boolArray[pos1] = position.get(pos1)
}
for(idx in 0 until boolArray.size){
if(boolArray[idx] == true){
textView.append("${dateList[idx]}\n")
}
}
}
builder.show()
// 다중 선택 다른 방식
// mutilChoiceList : 체크 여부 담은 booleanArray로 lateinit var activityBinding 선언부 밑에 작성
val builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("다중 선택 리스트 다이얼로그")
builder.setMultiChoiceItems(dateList, mutilChoiceList, null)
builder.setNegativeButton("취소", null)
builder.setPositiveButton("확인", null)
builder.show()
notification
- 상단바를 내렸을 때 알림창에 뜨는 메세지
etc
- ACTION_VIEW : 뭔가를 보여주는 activity에 사용되는 공통된 view
- 키보드 올리는 코드 작성해주는 것이 좋다. thread를 돌려도 되는 지는 실행해보고 필요하지 않으면 thread 작성하지 않아도 좋다.
'Android' 카테고리의 다른 글
[Android] Thread & Fragment (0) | 2023.06.26 |
---|---|
[Android] Android Message - Notification (0) | 2023.06.23 |
[Android] Parcelable (0) | 2023.06.19 |
[Android] Menu & Activity (0) | 2023.06.16 |
[Android] 권한 (0) | 2023.06.15 |
Comments