바로가기 메뉴 만들기(1)의 xml 내용에 이어서 이번엔 자바 코드 파일들의 내용을 살펴보겠다.
MainActivity.java의 내용이다
package org.techtown.drawer;
import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import org.techtown.drawer.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.appBarMain.toolbar);
binding.appBarMain.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
.setOpenableLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
뷰바인딩을 통해 ActivityMainBinding 클래스로 레이아웃 뷰와 결합하였다.
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar 메소드로 액션 바를 설정하였다.
setSupportActionBar(binding.appBarMain.toolbar);
drawer 레이아웃과 NavigationView 뷰를 참조한다.
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
상단 앱 바를 사용하기 위해 NavigationUI를 사용한다.
이를 위해 AppBarConfiguration 객체를 만들어 사용한다.
Builder를 이용해 사용할 navigation_graph와 DrawerLayout을 전달한다.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
.setOpenableLayout(drawer)
.build();
navHost의 Fragment들을 조종할 수 있는 NavigationController 객체를 만든다.
navHost를 참조해 가져와 navController에 할당한다.
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
NavigationUI클래스의 setupActionBarWithNavController 메소드를 사용하여 Fragment의 전환에 따라 액션바도 Fragment를 따라서 함께 변화하도록 세팅한다.
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI클래스의 setupWithNavController 메소드를 사용해 NavigationView를 NavController에 맞게 구현한다.
NavigationUI.setupWithNavController(navigationView, navController);
onSupportNavigateUp 메소드를 Override 하여 상단 액션 바의 뒤로 버튼을 눌렀을 때를 처리한다.
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}