액션바에서 명령 전달보다 더 복잡한 동작을 직접 처리하려면 원하는 위젯이나 뷰그룹을 액션바에 배치하는데 이를 액션 뷰라고 한다.
메뉴 항목에 다음 두 속성을 사용하여 액션 뷰를 지정한다.
속성 |
설명 |
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가 축소됬을 때
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[펌자료] 안드로이드 - 액티비티의 상태를 저장 및 복원하는 콜백 메소드 - onSaveInstanceState, onRestoreInstanceState (0) | 2015.10.04 |
---|---|
안드로이드 - ShareActionProvider를 이용한 앱간 데이터 공유 처리하기 (0) | 2015.10.04 |
안드로이드 - 액션바의 활용 두번째 액션 프로바이더 (0) | 2015.09.28 |
안드로이드 - 프래그먼트를 이용한 간단한 사전 만들기 (0) | 2015.09.21 |
안드로이드 - 앱 로고 아이콘 (0) | 2015.09.20 |
안드로이드 - 액션바 숨기기 및 보이기 (0) | 2015.09.20 |
안드로이드 - 액션바 기초 (0) | 2015.09.20 |
안드로이드 - 이클립스에서 안드로이드 SDK MANAGER가 안보일때 (0) | 2015.09.19 |