프로젝트 이름 : MyOptionMenu
액션바는 상단의 타이틀 부분이라고 생각하면 된다
버튼같은것도 집어넣을 수 있다.
툴바 기능까지 하게된다
옵션메뉴는 액션바 상단에 포함되어 있다.
요즘은 옵션 메뉴가 액션바에 포함되어 있다 (... 버튼을 누르면 표시되게)

res 디렉토리 밑에 menu 디렉토리를 만든다
res 디렉토리는 하위 디렉토리의 이름이 뭔지에 따라 해당 디렉토리에 만들수 있는 파일의 종류가 달라지거나 동작방식이 달라진다.
menu라고 만들면 메뉴를 위한 xml 파일을 만들 수 있다.

따라서 menu 디렉토리를 우클릭 하고 파일을 만들려고 보면 menu xml file 항목으로 표시된다.
<?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/menu_refresh"
android:title="새로고침"
android:icon="@drawable/refresh"
app:showAsAction="always"
/>
<item
android:id="@+id/menu_search"
android:title="검색"
android:icon="@drawable/search"
app:showAsAction="always"
/>
<item
android:id="@+id/menu_settings"
android:title="설정"
android:icon="@drawable/setting"
app:showAsAction="always"
/>
</menu>
menu_main.xml 파일은 최상위 태그가 menu 태그이다
item 요소를 이용해서 아이템들을 추가한다.
title은 표시되는 이름이고 showAsAction은 메뉴 바에 항상 표시하려면 always이다.
never ,if room도 있다. if room일 경우 공간이 있을 때만 표시한다.
이렇게 표시되지 않으면 ... 을 눌렀을 때 항목이 표시되는 것이다.
이렇게 xml 파일을 만들었으면 화면에 설정을 해줘야 한다.
package com.example.optionmenu;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
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);
return true;
}
}
화면에 설정하기 위해 MainActivity.java에서 onCreateOptionsMenu를 오버라이딩 해준다
메소드 내에서 메뉴인플레이터를 이용해서 인플레이션 하면 화면에 보이게 된다.

이렇게 메뉴 아이템들이 표시된다!
package com.example.optionmenu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
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);
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_LONG).show();
break;
case R.id.menu_search:
Toast.makeText(this,"검색 메뉴 클릭됨",Toast.LENGTH_LONG).show();
break;
case R.id.menu_settings:
Toast.makeText(this,"설정 메뉴 클릭됨",Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
MainActivity.java 에서 onOptionsItemSelected 메소드를 오버라이딩 해준다. 매개변수는 선택된 메뉴아이템이다.
getItemId로 아이템의 id를 int형으로 받을 수 있다.


강의에서는 styles.xml인데 나는 themes.xml이다

AndroidManifest.xml에서 보면 theme이 @style/Theme.MyOptionMenu로 지정되어 있다
Themes.xml에 Theme.myOptionMenu 속성이 지정된 것을 테마로 사용하는 것이다.
액션바가 보이지 않게 하려면 속성이 DarkActionBar인데 NoActionBar로 바꾸면 액션바가 사라진다.
또는 MainAcivity.java에서
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar abar = getSupportActionBar();
abar.hide();
}
getSupportActionBar로 액션바를 얻고 hide를 호출해서 액션 바를 없앨 수도 있다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="검색"
android:textSize="16dp"
android:textColor="#ffad8745"
/>
<EditText
android:id="@+id/editText"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
/>
</LinearLayout>
layout에 serach_layout.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/menu_refresh"
android:title="새로고침"
android:icon="@drawable/refresh"
app:showAsAction="always"
/>
<item
android:id="@+id/menu_search"
android:title="검색"
android:icon="@drawable/search"
app:showAsAction="always|withText"
android:actionLayout="@layout/search_layout"
/>
<item
android:id="@+id/menu_settings"
android:title="설정"
android:icon="@drawable/setting"
app:showAsAction="always"
/>
</menu>
menu_main.xml을 이렇게 바꿔준다
검색 item의 showAsAction 속성을 바꾸고 actionLayout 에 만든 레이아웃 파일을 넣어줬다.

이렇게 레이아웃이 아이템에 표시된다
나는 버전 차이인지 공간이 없어서 그런지 레이아웃이 표시되지는 않는다.