본문 바로가기
프로그래밍/Android

(Android) SearchView - 검색할 수 있는 메뉴

by LiveData 2018. 12. 20.
반응형

SearchView : 검색할 수 있는 메뉴




위와 같이 앱의 상단에 검색할 수 있는 메뉴를 만들 수 있습니다.






상단 메뉴 만들기 예제





1. 메뉴 xml 만들기


 -> res 폴더 아래에 menu 폴더(directory)를 만들고 "search_menu" 이름의 xml파일을 만들어줍니다.





search_menu.xml에 메뉴 아이템 코드를 만들어 줍니다.



search_menu.xml 코드


1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
      xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
      android:title="@string/search"
      android:icon="@android:drawable/ic_menu_search"
      app:showAsAction="collapseActionView|ifRoom"
      app:actionViewClass="android.widget.SearchView" />
</menu>
cs






2.activity_main.xml 코드 만들기



searchView가 어떻게 동작하는지를 Log가 아닌 화면에 보이도록 구성하겠습니다.


text와 button으로 구성되있으며 일단 복사 붙혀넣기 하시면 됩니다.




activity_main.xml 코드


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
 
    <TextView
        android:id="@+id/txtsearch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="검색식 : "
         android:textSize="25dp"/>
 
    <TextView
        android:id="@+id/txtresult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="검색결과"
        android:textSize="25dp"/>
 
    <TextView
        android:id="@+id/txtstatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="현재 상태 : 축소됨"
        android:textSize="25dp"/>
 
    <Button
        android:id="@+id/btnexpand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="mOnClick"
        android:text="확장"
        />
 
    <Button
        android:id="@+id/btncollapse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="mOnClick"
        android:text="축소"/>
 
</LinearLayout>
 
cs






3.MainActivity



setOnActionExpandListener - 메뉴의 확장과 축소 이벤트 관리

setOnQueryTextListener - 검색,변경 이벤트 관리


 

 

MainActivity 코드


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.example.dud57.testsearchview;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.SearchView;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    MenuItem mSearch;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    //메뉴 생성하는 onCreateOptionsMenu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
 
        //search_menu.xml 등록
        MenuInflater inflater=getMenuInflater();
        inflater.inflate(R.menu.search_menu,menu);
        mSearch=menu.findItem(R.id.search);
 
        //메뉴 아이콘 클릭했을 시 확장, 취소했을 시 축소
        mSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                TextView text=(TextView)findViewById(R.id.txtstatus);
                text.setText("현재 상태 : 확장됨");
                return true;
            }
 
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                TextView text=(TextView)findViewById(R.id.txtstatus);
                text.setText("현재 상태 : 축소됨");
                return true;
            }
        });
 
 
        //menuItem을 이용해서 SearchView 변수 생성
        SearchView sv=(SearchView)mSearch.getActionView();
        //확인버튼 활성화
        sv.setSubmitButtonEnabled(true);
 
        //SearchView의 검색 이벤트
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
 
            //검색버튼을 눌렀을 경우
            @Override
            public boolean onQueryTextSubmit(String query) {
                TextView text = (TextView)findViewById(R.id.txtresult);
                text.setText(query + "를 검색합니다.");
                return true;
            }
 
            //텍스트가 바뀔때마다 호출
            @Override
            public boolean onQueryTextChange(String newText) {
                TextView text = (TextView)findViewById(R.id.txtsearch);
                text.setText("검색식 : "+newText);
                return true;
            }
        });
        return true;
    }
 
    // 검색 확장,축소를 버튼으로 생성
    public void mOnClick(View v) {
        switch (v.getId()) {
            case R.id.btnexpand:
                mSearch.expandActionView();
                break;
            case R.id.btncollapse:
                mSearch.collapseActionView();
                break;
        }
    }
}
cs







4. 결과



setSubmitButtonEnabled(true)를 하면 X버튼 옆에 검색 버튼을 만들 수 있습니다.



 



검색을 하고 있을 경우 "검색식"의 text가 계속 바뀌게 됩니다.


검색버튼을 눌렀을 경우 "~검색합니다" 가 바뀌게 됩니다.





참고

http://gakari.tistory.com/entry/안드로이드-액션바의-활용-첫번째-SeachView


반응형