액션바는 기본적으로 제목을 보여주는 타이틀 기능을 하므로 앱의 제목을 보여줄 수 있으며,
이러한 액션바는 화면에 보이거나 보이지 않도록 만들 수 도 있다.
소스 코드에서 액션바를 보이게 만들고 싶다면 getSupportActionBar 메소드로 ActionBar 객체를 참조하고 show 메소드를 호출하면 되고, 감추고 싶다면 hide 메소드를 호출한다.
ActionBar abar = getSupportActionBar();
abar.show();
abar.hide();
activity_main.xml 파일에 버튼을 하나 추가한다.
액션 바 사용하기(1)에서 사용했던 menu_main.xml 파일을 그대로 사용한다.
MainActivity.java 파일을 수정한다.
public class MainActivity extends AppCompatActivity {
ActionBar abar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
abar = getSupportActionBar();
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
abar.setLogo(R.drawable.home);
abar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int curId = item.getItemId();
switch (curId) {
case R.id.menu_refresh:
Toast.makeText(this, "새로고침", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_search:
Toast.makeText(this, "검색", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_settings:
Toast.makeText(this, "설정", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
액션 바 사용하기(1)과 같은 방법으로 onCreateOptionMenu와 onOptionsItemSelected 메소드를 재정의하였다.
getSupportActionBar 메소드를 이용해 XML 레이아웃에 들어 있는 ActionBar 객체를 참조한다.
abar = getSupportActionBar();
버튼을 눌렀을 때
setLogo 메소드로 로고를 설정하고,
setDisplayOptions 메소드를 사용해 액션바가 보이는 모습을 바꾼다.
abar.setLogo(R.drawable.home);
abar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO);
setDisplayOptions 메소드에 사용할 수 있는 상수들은 다음과 같다.
디스플레이 옵션 상수 | 설명 |
---|---|
DISPLAY_USE_LOGO | 홈 아이콘 부분에 로고 아이콘을 사용한다. |
DISPLAY_SHOW_HOME | 홈 아이콘을 표시하도록 한다. |
DISPLAY_HOME_AS_UP | 홈 아이콘에 뒤로 가기 모양의 < 아이콘을 같이 표시한다. |
DISPLAY_SHOW_TITLE | 타이틀을 표시하도록 한다. |
액션바 안에 넣을 입력상자 레이아웃 search_layout.xml을 만든다.
이 레아아웃은 택스트 뷰와 입력상자로만 아루어진 간단한 레이아웃이다.
액션 바 사용하기(1)에서 사용했던 menu_main.xml 파일을 가져온다.
그 후, id:menu_search인 item을 삭제한 후, 다음과 같은 item을 추가한다.
<item
android:id="@+id/menu_search"
android:title="검색"
android:orderInCategory="102"
app:showAsAction="always|withText"
app:actionLayout="@layout/search_layout"
/>
orderInCategory 속성은 메뉴가 보이는 순서를 결정하며 101,102,103처럼 작은 숫자부터 순서대로 지정한다.
actionLayout 속성을 사용해 메뉴가 화면에 보여질 때의 방식을 설정한다.
MainActivity를 수정한다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
View v = menu.findItem(R.id.menu_search).getActionView();
if (v != null){
EditText editText = v.findViewById(R.id.editText);
if(editText != null){
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Toast.makeText(getApplicationContext(), "입력 확인", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
return true;
}
}
onCreateOptionsMenu 메소드를 재정의한다.
그 후 그 안에서 메뉴 아이템 중에서 id가 menu_search인 아이템을 뷰 객체로 참조한다.
View v = menu.findItem(R.id.menu_search).getActionView();
참조한 아이템 안에 정의한 입력상자 객체를 참조한다.
EditText editText = v.findViewById(R.id.editText);
입력상자 객체에 리스너를 설정한다.
이 리스너는 키패드의 '완료 키'를 누를 때의 리스너이다.
이 부분에 원하는 기능을 넣으면 된다.
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Toast.makeText(getApplicationContext(), "입력 확인", Toast.LENGTH_SHORT).show();
return true;
}
});