NOW OR NEVER

[Android] 다른 앱에서의 activity 사용 & Android Message 본문

Android

[Android] 다른 앱에서의 activity 사용 & Android Message

LAURA 2023. 6. 22. 17:11
반응형

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부터 가능)
// 안드로이드 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가 사라졌습니다" }
      • })
    • 3. snackbar 보여주기 : snackbar객체.show()

 

  • 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