Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[41일차 Android] ActionView 본문

Computer/Android

[41일차 Android] ActionView

Wise-99 2023. 7. 1. 20:27

 

 

 

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

 

 

 

📖 ActionView

  • ActionBar에 View를 배치하고 이를 접었다 폈다 할 수 있는 개념
  • 주로 검색 기능을 만들 때 사용한다.

 

예제 코드

menu/main_menu.xml

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

    <item
        android:id="@+id/item1"
        android:icon="@android:drawable/ic_menu_search"
        android:title="SearchBar"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"/>
</menu>
  • collapseActionView
    • 사용자가 위젯과 상호작용하지 않을 때 위젯을 표시하는 방법을 나타낸다.
    • 위젯이 앱 바에 있는 경우 앱은 위젯을 아이콘으로 표시한다.
    • 위젯이 더보기 메뉴에 있는 경우 앱은 위젯을 메뉴 항목으로 표시한다.
    • 사용자가 작업 뷰와 상호작용할 때는 위젯이 확장되어 앱 바를 채운다.

 

activity_main.xml

<?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"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <ListView
        android:id="@+id/list1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    // listView의 데이터
    val data1 = arrayOf(
        "aaaa", "bbbb", "cccc", "aabb", "ccdd"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            list1.run{
                adapter = ArrayAdapter<String>(
                    this@MainActivity, android.R.layout.simple_list_item_1, data1
                )
                // listView가 검색이 가능하도록 설정
                isTextFilterEnabled = true

                setOnItemClickListener { adapterView, view, i, l ->
                    // listView에서 i번째 항목의 문자열 값을 가져온다.
                    val str1 = adapterView.adapter.getItem(i) as String
                    // 해당 문자열이 몇 번째에 있는지 확인한다.
                    val idx = data1.indexOf(str1)
                    activityMainBinding.textView3.text = data1[idx]
                }
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {

        menuInflater.inflate(R.menu.main_menu, menu)

        // SearchView를 가지고 있는 MenuItem을 가져온다.
        val item1 = menu?.findItem(R.id.item1)
        // SearchView 추출
        val searchView = item1?.actionView as SearchView
        // 안내 문구를 설정한다.
        searchView.queryHint = "검색어 입력"
        
        // ActionView가 펼쳐지거나 접혔을 때
        item1.setOnActionExpandListener(object : MenuItem.OnActionExpandListener{
            // 펼쳐졌을 때
            // true를 반환하면 펼쳐지고 false를 반환하면 펼치지지 않는다.
            override fun onMenuItemActionExpand(p0: MenuItem): Boolean {
                activityMainBinding.textView.text = "펼쳐 졌을 때"
                return true
            }
            // 접혔을 때
            // true를 반환하면 접혀지고 false를 반환하면 접혀지지 않는다.
            override fun onMenuItemActionCollapse(p0: MenuItem): Boolean {
                activityMainBinding.textView.text = "접혀 졌을 때"
                return true
            }
        })

        // SerachView의 리스너
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
            // 문자열 입력이 완료되었을 때
            override fun onQueryTextSubmit(query: String?): Boolean {
                activityMainBinding.textView.text = "문자열 입력 완료"
                activityMainBinding.textView2.text = "입력 완료 : $query"
                searchView.clearFocus()

                // ActionView를 접어준다.
                item1.collapseActionView()

                return true
            }

            // 입력 중에 호출되는 메서드
            override fun onQueryTextChange(newText: String?): Boolean {
                activityMainBinding.textView.text = "문자열 입력중"
                activityMainBinding.textView2.text = "입력 중 : $newText"

                // ListView 검색어 설정
                activityMainBinding.list1.setFilterText(newText)

                // 검색어가 없으면 필터를 초기화
                if(newText?.length == 0){
                    activityMainBinding.list1.clearTextFilter()
                }

                return true
            }
        })

        return super.onCreateOptionsMenu(menu)
    }
}

 

결과

ListView의 항목 선택 검색어 입력

'Computer > Android' 카테고리의 다른 글

[41일차 Android] ToolBar  (0) 2023.07.01
[41일차 Android] ActionBar Navigation  (0) 2023.07.01
[41일차 Android] ActionBar  (0) 2023.07.01
[39일차 Android] Fargment  (0) 2023.07.01
[39일차 Android] Service  (0) 2023.06.29