res/values/themes/themes.xml 파일에서 정의하는 테마를 바꾸어주어야 한다.
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">"
라고 정의된 부분을
<style name="Theme.MakeButton" parent="Theme.AppCompat.Light.NoActionBar">
로 바꿔준다.
위 xml코드는 기본적으로 제공하는 테마를 상속받도록 하는 테마이고 우리는 새로운 앱바를 만들어서 적용할 것이기 떄문에 default값으로 지정된 테마를 제거해야한다.
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
메인 xml 파일의 레이아웃 안에 툴바를 만들어서 넣어준다.
디자인은 원하는 디자인으로 변경하면 된다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 추가
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
}
메인 xml파일에 정의된 레이아웃들을 setContentView()를 이용해서 낚아채오면 툴바의 id를 이용해 가져온다.
setTitle() method를 이용해서 툴바의 이름을 지정해주고
setSupportActionBar() method를 이용해서 툴바를 액션바로 지정한다.
먼저 res/ 아래에 menu 폴더를 만든 후에 menu를 정의한 xml파일을 만든다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--앱바에 표시될 메뉴 아이템들-->
<item
android:id="@+id/search"
android:icon="@drawable/baseline_east_24"
android:title="Item"
app:showAsAction="always" />
<item
android:id="@+id/option"
android:icon="@mipmap/ic_launcher_round"
android:title="Item"
app:showAsAction="always" />
</menu>
예제로 두 개의 아이템을 만들었다.
참고로 menu 폴더에서 만드는 xml 파일들의 이름은 전부 소문자로 지정해야 한다고 한다. (왜인지는 모르겠다..)
설명하기 전에 안스에서 on으로 시작하면은 이벤트를 처리하는 메소드로 알고있고 액티비티가 처음 시작하면 onCreate()가 자동적으로 실행되는 것처럼 onCreateOptionMenu()도 처음 액티비티가 실행되면 자동으로 실행된다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menuitem, menu);
return true;
}
getMenuInflater()는 메뉴를 다루는 객체인 MenuInfalter 반환하는 메소드이다.
MenuInfalter 객체에 inflate() 메소드를 이용해서 res폴더에 미리 만들어놓은 menuitem.xml파일을 가져와서 inflate한다
inflate는 안드로이드에서 XML 레이아웃 파일을 로드하고, 해당 레이아웃을 메모리에 객체로 생성하는 메서드입니다. 이 메서드를 사용하면 앱에서 XML 레이아웃 파일을 쉽게 로드하여 화면에 보여줄 수 있다.
inflate 메서드는 LayoutInflater 클래스에서 제공되며, LayoutInflater 객체의 inflate 메서드를 호출하여 사용한다.
onCreateOptionMenu()로 가져온 아이템들이 선택되었을 때에 어떤 action을 할 것인지를 정의한 method이다.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
Toast.makeText(getApplicationContext(), "Search Click", Toast.LENGTH_SHORT).show();
return true;
case R.id.option:
Toast.makeText(getApplicationContext(), "Option Click", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
위 에제는 앞서 설정한 메뉴 버튼들이 클릭되었을 때 Toast 메세지를 출력하는 예제이다.
두 메소드 모두 원래 AppCompatActivity class에 정의되어 있는 method(더 정확히는 Activity class)이며 이를 overridding 해서 사용하는 것이다.