ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TECHIT 앱 스쿨 2기: Android 43일차 (23.06.28)
    [THEC!T] 앱 스쿨2기 : Android 2023. 6. 29. 03:19
    728x90

    자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용

     

    오늘은 ActionBar 내 액션 아이템들 에 대한 내용으로부터 시작하였습니다.

    주요 속성은 하기와 같습니다.

     

    None :  ActionBar에 표시하지 않는다.
    Always : 항상 ActionBar에 표시된다.
    ifRoom : 표시할 수 있는 공간이 있을 경우 ActionBar에 표시된다.
    Icon : ActionBar에 표시될 때 사용할 아이콘을 지정한다.
    withText : 공간이 허락될 경우 아이콘과 함께 문자열을 표시한다.

     

    다음으로는 ActionView에 대해서 배웠습니다.

    간단히 설명하자면 검색 기능을 만들 때 사용하며, ActionBar에 배치하는 View 입니다. 

     

    ActionView 을 사용하기 위한 주요 부분

     

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    
        menuInflater.inflate(R.menu.main_menu, menu)
    
        val item1 = menu?.findItem(R.id.item1)
    
        val searchView = item1?.actionView as SearchView
    
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
            override fun onQueryTextSubmit(query: String?): Boolean {
                // 키보드의 검색 버튼을 클릭한 순간 발생하는 이벤트
    
                return false
            }
    
            override fun onQueryTextChange(newText: String?): Boolean {
                // 검색어가 변경될 때 발생하는 이벤트
                if(newText != null){
                
                }
                return false
            }
    
        })

     

    또한 강사님께서 리스트뷰를 이용하여 리스트뷰의 정보가 갱신하는 법을 알려주셨고, 리사이클러뷰의 정보를 갱신하는 방법은 한번 찾아보라고 하셨습니다. (아직 알려주신 상태는 아닙니다.)

     

    그래서 검색을 통하여 해당 기능을 구현을 하긴 하였으나, 최적의 방법이 아닐 수 있습니다.

     

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
        override fun onQueryTextSubmit(query: String?): Boolean {
            // 키보드의 검색 버튼을 클릭한 순간 발생하는 이벤트
    
            return false
        }
    
        override fun onQueryTextChange(newText: String?): Boolean {
            // 검색어가 변경될 때 발생하는 이벤트
            if(newText != null){
                var updateList = foodList.filter { it.contains(newText) } as MutableList<String>
                val newadapter = RecyclerAdapter()
                newadapter.filter(updateList)
                activityMainBinding.mainRycView.adapter = newadapter
            }
            return false
        }
    
    })

     

    inner class RecyclerAdapter : RecyclerView.Adapter<RecyclerAdapter.ViewHolderClass>(){
    
        var filterList = mutableListOf<String>()
    
        inner class ViewHolderClass(rowBinding: RycRowBinding): ViewHolder(rowBinding.root){
            var food : TextView
            init{
                food = rowBinding.textView
    
                rowBinding.root.setOnClickListener {
                    val builder = AlertDialog.Builder(this@MainActivity)
                    builder.setTitle("선택한 재료")
                    builder.setMessage("${filterList[adapterPosition]}을 선택하셨습니다.")
                    builder.setPositiveButton("확인", null)
    
                    builder.show()
                }
    
            }
        }
    
        fun filter(filter : MutableList<String>){
            filterList = filter
            notifyDataSetChanged()
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
            val rowBinding = RycRowBinding.inflate(layoutInflater)
            val viewHolderClass = ViewHolderClass(rowBinding)
    
            val params = RecyclerView.LayoutParams(
                RecyclerView.LayoutParams.MATCH_PARENT,
                RecyclerView.LayoutParams.WRAP_CONTENT
            )
    
            rowBinding.root.layoutParams = params
    
            return viewHolderClass
        }
    
        override fun getItemCount(): Int {
            return filterList.size
        }
    
        override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
            holder.food.text = filterList[position]
        }
    }

     

     

    이 후에는 back버튼 혹은 업버튼 이라고 불리는 에 대해서 알려주셨습니다.

    해당 버튼의 기능은 액티비티 화면이 앱의 첫 화면 이 아닐 때 이전 화면으로 되돌아 가는 기능을 합니다.

     

    주요코드

     

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    
        // HomeButton을 활성화 한다.
        supportActionBar?.setHomeButtonEnabled(true)
        // HomeButton을 노출시킨다.
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        // 아이콘을 변경한다. 
        // supportActionBar?.setHomeAsUpIndicator(R.mipmap.ic_launcher)
    }
    
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
    
        when(item.itemId){
            // 백버튼
            android.R.id.home -> {
                // 현재 Activity를 종료한다.
                finish()
            }
        }
    
        return super.onOptionsItemSelected(item)
    }

     

    다음으로는 툴바에 대해서 알려주셨습니다.

    그런데 보기에는 액션바와 큰 차이가 없지만, 개발자 입장에서는 액션바와 다르게 툴바는 개발자가 직접 제어가 가능하여 액션바보다 다양한 기능을 제공할 수 있습니다.

     

    주요 코드

    toolbar.run{
        // 타이틀
        title = "ToolBar"
        // 타이틀 글자 색상
        setTitleTextColor(Color.WHITE)
        // 옵션 메뉴를 구성한다.
        inflateMenu(R.menu.main_menu)
    
        setOnMenuItemClickListener {
            // 사용자가 누른 메뉴의 id로 분기한다.
            when(it?.itemId){
                R.id.item1 ->{
                    textView.text = "메뉴1을 눌렀습니다."
                }
                R.id.item2 ->{
                    textView.text = "메뉴2를 눌렀습니다."
                }
            }
            
            setTitleTextColor(Color.WHITE)
            // 백 버튼 아이콘을 표시한다.
            setNavigationIcon(androidx.appcompat.R.drawable.abc_ic_ab_back_material)
            // 백 버튼의 아이콘 색상을 변경한다.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
                navigationIcon?.colorFilter = BlendModeColorFilter(Color.WHITE, BlendMode.SRC_ATOP)
            } else {
                navigationIcon?.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
            }
            
            false
        }
    }

     

    이후로는 뷰 바이져2, AppBarLayout, TabLayOut에 대해서 알려주셨고, 해당 내용은 좀 더 정리를 진행한 후 작성 할 수 있도록 하겠습니다.

     

    마무리

    요즘 배우는 것에 대한 난이도가 확 올라갔다는 느껴집니다. 당일 복습한 내용을 정리하는데 오래 걸리지 않았지만, 요즘은 기본적으로 3~4시간은 걸리는 것 같습니다. 원인은 그 만큼 복습을 하면서 모르면 알아보고, 조금씩 응용도 해보고 하다보니 더 시간이 걸리는 것도 있습니다. 하지만 장점으로는 비록 일부 부족할 수 있더라도 최소한의 기초공사들을 진행하면서 나아가는 느낌이라 개인적으로는 피곤하면서도 뿌듯한 것 같습니다. 

    잠은 몰아서 자는걸로.....ㅋㅋㅋ

     

    오늘의 마음가짐

    기초공사가 부실한 상태에서 쌓아올려봤자 금방 무너지기에 기초공사를 튼튼히 하자

Designed by Tistory.