개발

02/28 ~ 03/04 Mini Project - Project II(Introduce I)

sos000303 2024. 3. 4. 20:37
728x90

어제에 이어서 오늘도 프로젝트 기능구현을 했다.

오늘 내가 맡은 부분은 툴바의 메뉴 기능과 액티비티 이동기능이다. 

툴바 기능은 오늘 처음 사용해봐서 다른 블로그를 많이 참고했다.

02/28

먼저 툴바를 처음 만들어보니 어떻게 만드는지 부터 찾아보았다.

툴바는 어느 액티비티로 넘어가도 있어야하니까 각 액티비티의 xml파일에 하나씩 지정하는 것이 아니라 레이아웃을 하나 따로 만들어서 그 레이아웃을 각 액티비티마다 불러와서 사용했다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:background="@color/grey">

    <ImageView
        android:id="@+id/return_btn"
        android:layout_width="30dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:src="@drawable/ic_return"
        android:visibility="gone" />

</androidx.appcompat.widget.Toolbar>

처음에는 뒤로가기 기능만 추가해 버튼을 누르면 아래와 같이 메인 액티비티를 열기만 하는 기능을 구현했다. 

returnBtn.setOnClickListener{
    val intent = Intent(this, MainActivity::class.java)
    startActivity(intent)
}

하지만 이렇게 하니 열려있던 액티비티들이 닫히지 않고 계속 스택에 쌓여있었고 프로그램이 느려졌다.

그래서 단순히 setOnClickListener에 현재 페이지를 닫는 finish() 만을 넣는 것으로 코드를 바꾸었다. 

returnBtn.setOnClickListener{
	finish()
}

액티비티가 3개밖에 없어 이러한 코드를 각 액티비티마다 집어 넣었다.

02/29

프로그램이 형태를 잡아 이제 각자 추가하고자 하는 기능이나 액티비티를 추가하기로 했다.

나는 툴바에 바로가기 기능이 달린 팝업 메뉴를 넣고 싶었고 그러기 위해 팝업 메뉴에 대해 찾아보았다.

팝업 메뉴는 res폴더에 menu디렉터리를 새로 만들어 그 안에 xml파일을 작성했다.

처음에 넣은 메뉴는 (메인화면, 팀 소개, 팀원소개, 팀원1, 팀원2, 팀원3, 팀원4) 였다.

처음에는 검색해서 블로그에 나와있는 내용에 따라 각 페이지 별로 popupMenu를 선언하고 인플레이터를 이용해 묶어주고 메뉴버튼을 눌렀을 때 팝업메뉴가 나오도록 설정했다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val popupMenu = PopupMenu(applicationContext,binding.addToolbar.menuBtn)
        menuInflater.inflate(R.menu.menu_pop_up, popupMenu.menu)
        popupMenu.show()
        popupMenu.setOnMenuItemClickListener{
	    when(it.itemId){
            	R.id.go_main -> {
                //intent를 이용해 MainActivity로 이동하는 코드
            	}
            	R.id.go_team -> {
                //intent를 이용해 TeamActivity로 이동하는 코드
            	}
            	R.id.go_member1 -> {
                //intent를 이용해 PersonalActivity로 이동하는 코드
                }
                //member2, member3, member4 동일
            }
        }
    }
}

위와 같이 작성했지만 이 역시 액티비티가 스택에 쌓이게 되어 느려졌다.

따라서 각 버튼에 finish()를 추가해 이동할 때마다 액티비티를 종료시켰지만 뒤로가기 버튼을 누르면 액티비티가 하나도 남지 않아 앱이 꺼지는 현상이 발생했다.

그래서 각 액티비티에 있는 툴바 코드마다 내용을 조금씩 다르게 바꾸어 메인 액티비티에서 툴바 버튼을 눌렀을 때에는 finish()를 넣지 않았다.

 

03/01

프로젝트가 진행될수록 사용하는 액티비티가 많아졌고 결국 툴바 기능을 전역 함수로 바꾸기로 했다. 

fun toolbarFun(menu:View, context: Context, popupMenu : PopupMenu, activity: Activity, pageNumber: Int, checkAdd: Activity = MainActivity() ,idx: Int= -55){
    menu.setOnClickListener{
        popupMenu.show()
        popupMenu.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.go_main -> {
                    if(pageNumber == 0) {
                        showToast(activity, "이미 메인 화면입니다.")
                    }//showToast는 Toast를 짧게 띄우는 전역 함수
                    else {
                        val intent = Intent(context, MainActivity::class.java)
                        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
                        startActivity(context, intent, null)
                    }
                    return@setOnMenuItemClickListener true
                }

                R.id.go_team -> {
                    if(pageNumber == 1){
                        showToast(context, "이미 팀 소개 화면입니다.")
                    }
                    else {
                        val intent = Intent(context, TeamActivity::class.java)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }


                R.id.go_member1 -> {
                    if(pageNumber == 2 && idx == 0) {
                        showToast(context, "이미 보고 있는 팀원입니다.")
                    }
                    else {
                        val intent = Intent(context, PersonalActivity::class.java)
                        intent.putExtra("indexNumber", 0)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }

                R.id.go_member2 -> {
                    if(pageNumber == 2 && idx == 1) {
                        showToast(context, "이미 보고 있는 팀원입니다.")
                    }
                    else {
                        val intent = Intent(context, PersonalActivity::class.java)
                        intent.putExtra("indexNumber", 1)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }

                R.id.go_member3 -> {
                    if(pageNumber == 2 && idx == 2) {
                        showToast(context, "이미 보고 있는 팀원입니다.")
                    }
                    else {
                        val intent = Intent(context, PersonalActivity::class.java)
                        intent.putExtra("indexNumber", 2)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }

                R.id.go_member4 -> {
                    if(pageNumber == 2 && idx == 3) {
                        showToast(context, "이미 보고 있는 팀원입니다.")
                    }
                    else {
                        val intent = Intent(context, PersonalActivity::class.java)
                        intent.putExtra("indexNumber", 3)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }

                R.id.themeMode -> {
                    val items = arrayOf("라이트 모드", "다크 모드", "사용자 지정")
                    val builder = AlertDialog.Builder(context)
                        .setTitle("테마 변경")
                        .setItems(items) { dialog, id ->
                            if (items[id] == "라이트 모드") {
                                changeTheme(AppCompatDelegate.MODE_NIGHT_NO)
                            } else if (items[id] == "다크 모드") {
                                changeTheme(AppCompatDelegate.MODE_NIGHT_YES)
                            } else {
                                changeTheme(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
                            }// changeTheme는 테마 변경하는 전역 함수
                        }
                    builder.show()

                    return@setOnMenuItemClickListener true
                }

                R.id.go_maker -> {
                    if(pageNumber == 4){
                        showToast(context, "이미 Credits 화면입니다.")
                    }
                    else {
                        val intent = Intent(context, CreditsActivity::class.java)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }
                R.id.go_calendar -> {
                    if(pageNumber == 5){
                        showToast(context, "이미 일정 화면입니다.")
                    }
                    else {
                        val intent = Intent(context, CalendarActivity::class.java)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }
                R.id.go_comment -> {
                    if(pageNumber == 6){
                        showToast(context, "이미 방명록 화면입니다.")
                    }
                    else {
                        val intent = Intent(context, CommentActivity::class.java)
                        startActivity(context, intent, null)
                        if (pageNumber == 3) checkAdd.finish()
                        if (pageNumber != 0) activity.finish()
                    }
                    return@setOnMenuItemClickListener true
                }


                else -> return@setOnMenuItemClickListener false
            }
        }
    }
}

페이지 이동과 스택, 생명 주기에 관해서 오류가 몇 가지 있었고 내 나름대로 FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_CLEAR_TASK, FLAG_ACTIVITY_NEW_TASK 등을 이용해 해결하려 했으나 잘 되지 않아 액티비티를 companion object를 이용해 다음 액티비티에서 변수로 받는 것으로 해결했다. 그러한 이유로 함수에 checkAdd라는 파라미터가 들어가 있다.

03/04

발표에서 해당 방법 및 해당 함수에 있는 파라미터에 관련해서 몇 가지 피드백을 들었다. 사실 피드백을 듣기는 했지만 아직 수명과 스택에 관해서 똑바로 아는 것이 아니라 어떻게 적용해야할 지 모르겠다. 해결이 된다면 다른 포스트에서 설명해보겠다.

728x90