프로그래밍/안드로이드

안드로이드 - 액션바의 활용 첫번째 SeachView

가카리 2015. 9. 20. 17:17
반응형

 

액션바에서 명령 전달보다 더 복잡한 동작을 직접 처리하려면 원하는 위젯이나 뷰그룹을 액션바에 배치하는데  이를 액션 뷰라고 한다.

 

메뉴 항목에 다음 두 속성을 사용하여 액션 뷰를 지정한다.

 

속성

설명

actionLayout

액션바에 배치할 뷰그룹의 레이아웃 리소스를 지정한다.

actionViewClass

액션바에 배치할 위젯의 클래스를 지정한다.

 

액션 뷰 객체를 구하거나 설정할 때는 메뉴 항목의 다음 메서드를 호출한다.

 

    View getActionView()

    MenuItem setActionView(int resId)

    MenuItem setActionView(View view)

 

onCreateOptionsMenu 메소드에서 메뉴를 전개한 후 메뉴 항목을 먼저 찾는다. 그리고 메뉴 항목의 getActionView 메소드로 액션 뷰 객체를 구하고

 

속성을 조정하거나 리스너를 설치한다.

 

액션뷰는 자체적으로 확장 및 축소가 가능하지만 코드에서도 다음 메소드를 호출하여 확장 및 축소할 수 있다.

 

    boolean expandActionView()

    boolean collapseActionView()

 

리스너에는 확장 및 축소될 때 호출되는 두 개의 메소드가 정의되어 있다.

 

    MeuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener)

    boolean onMenuItemActionExpand(MenuItem item)

    boolean onMenuItemActionCollapse(MenuItem item)

 

대표적인 액션바의 사용 예가 에디트이다. 대화상자를 따로 열 필요 없이 액션바에서 바로 정보를 입력할 수 있으므로 편리하다.

 

안드로이드는 이런 용도로 SearchView 위젯을 제공한다. 메뉴 항목의 actionViewClass 속성에 SearchView를 지정하면 쉽게 배치할 수 있다.

    

    void setIconifiedByDefault(boolean iconified)

    void setIconified(boolean iconify)

    boolean isIconfiedByDefault()

    boolean isIconified()

 

iconified 인수가 true이면 축소된 아이콘 형태로 열리며 디폴트가 true이다. 생성 직후에 이 값을 false로 지정하고 showAsAction 속성에

 

collapseActionView 플래그를 제거하면 처음부터 에디트가 확장된 채로 실행된다.

 

setIconified는 실행 중에 확장 및 축소할 때 사용한다.

 

검색뷰의 에디트를 편집할 때 이벤트를 가로채려면 다음 메소드로 리스너를 등록한다.

 

    void setOnQueryTextListener(SearchView.OnQueryTextListener listener)

    boolean onQueryTextChange(String newText)

    boolean onQueryTextSubmit(String query)

 

이 메소드에서 true를 리턴하면 텍스트 변경 이벤트를 처리했다는 뜻이다.

 

다음 예제는 SeachView를 활용해보는 예제이다.

 

 

action_view.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

tools:context="com.example.actionview.ActionView" >

 

    <item

     android:title="search"

     android:id="@+id/search"

     android:icon="@android:drawable/ic_menu_search"

     android:showAsAction="always|collapseActionView"

     android:actionViewClass="android.widget.SearchView"

     />

 

</menu>

 

 

activity_action_view.xml

<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="검색식 : "/>

<TextView

android:id="@+id/txtresult"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="검색결과"/>

<TextView

android:id="@+id/txtstatus"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="현재 상태 : 축소됨"/>

<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>

 

 

ActionView.java

package com.example.actionview;

 

import android.app.Activity;

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 ActionView extends Activity {

    MenuItem mSearch;

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_action_view);

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        //메뉴에는 서치뷰 항목 하나만 배치함.

        MenuInflater inflater = getMenuInflater();

        inflater.inflate(R.menu.action_view, menu);

        mSearch = menu.findItem(R.id.search);

          

        

        mSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

            

            @Override

            public boolean onMenuItemActionExpand(MenuItem item) {

                // TODO Auto-generated method stub

                //서치뷰가 확장됬을         

                TextView text = (TextView)findViewById(R.id.txtstatus);

                text.setText("현재 상태 : 확장됨");

                return true;

            }

            

            @Override

            public boolean onMenuItemActionCollapse(MenuItem item) {

                // TODO Auto-generated method stub

                //서치뷰가 축소됬을

                TextView text = (TextView)findViewById(R.id.txtstatus);

                text.setText("현재 상태 : 축소됨");

                return true;

            }

        });

 

        SearchView sv = (SearchView)mSearch.getActionView();

        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            

            @Override

            public boolean onQueryTextSubmit(String query) {

                // TODO Auto-generated method stub

                //검색 버튼이 눌리면

                TextView text = (TextView)findViewById(R.id.txtresult);

                text.setText(query + " 검색합니다.");

                return true;

            }

            

            @Override

            public boolean onQueryTextChange(String newText) {

                // TODO Auto-generated method stub

                //검색창에 글자를 쓰면 여기로

                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;

        }

    }

}

 

실행 화면

SeachView가 확장 됬을 때

 

SearchView가 축소됬을 때