본문 바로가기

안드로이드/XML

SearchView

SearchView는 검색창을 구현할 때 사용한다.

 

보통 사용 유형은 Toolbar와 함께 사용하거나, SearchView를 따로 사용하는 유형이 있다.

 

1. SearchView

 

<androidx.appcompat.widget.SearchView
        android:id="@+id/searchView"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:inputType="text"
        app:iconifiedByDefault="false"
        app:queryHint="쿼리 힌트"/>
  • iconifiedByDefault 
    • true : 아이콘 상태 >> 클릭 시 입력창 표시
    • false : 항상 입력창 표시

 

binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
            override fun onQueryTextSubmit(query: String?): Boolean {
                // TODO Enter 입력 시 호출되는 함수
				
                binding.searchView.clearFocus() // 검색 완료 시 포커스 제거
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                //TODO 검색창 내용 변경 시 매번 호출되는 함수

                return false
            }

        })
        
 // 검색 완료 후 키보드 숨기기
 binding.searchView.setOnQueryTextFocusChangeListener { view, hasFocus ->
            if(hasFocus){
                val inputMethodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY)
            }
        }

 

 

2. Toolbar SearchView

1. Toolbar View를 사용할 예정으로 AndroidManifest.xml에서 NoActionBar로 변경

android:theme="@style/Theme.AppCompat.Light.NoActionBar"

 

 

2. toolbar_searchview.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/searchView"
        android:title="@string/searchView"
        android:icon="?attr/actionModeWebSearchDrawable"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom"/>
</menu>

 

두번째로 menu에서 위와 같이 생성

 

3. 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"/>

</LinearLayout>

 

 

4. MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.toolbar)

    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.toolbar_searchview, menu)
        val mSearch = menu!!.findItem(R.id.searchView)
        val sv: SearchView = mSearch.actionView as SearchView

        // 설정
        sv.setIconifiedByDefault(false)
        sv.queryHint = "검색하세요.."
        sv.maxWidth = Int.MAX_VALUE
        sv.isFocusable = true

        sv.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
            override fun onQueryTextSubmit(query: String?): Boolean {

                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {

                return false
            }

        })

        return super.onCreateOptionsMenu(menu)
    }
}