Android - 바로가기 메뉴 만들기(2)

유의선·2023년 6월 26일
0

바로가기 메뉴 만들기(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();
    }


0개의 댓글