반응형

사용자가 특정 화면에서 손가락으로 화면을 스와이프했을때, DrawerLayout Open을 막고 싶을때 사용된다.

 

 

1. 소스

[Kotlin/Android] DrawerLayout 사용자 액션 막기(화면 스와이프)

1. 소스

 private lateinit var drawerLayout: DrawerLayout
    
override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	@Suppress("UNUSED_VARIABLE")
	val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
	val navController = this.findNavController(R.id.myNavHostFragment)
	// 액션바에 네비게이션 컨트롤러 등록
	NavigationUI.setupActionBarWithNavController(this, navController)
	
	drawerLayout = binding.drawerLayout
	
	// 액션바에 drawer layout 뷰 추가
	NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
	
	// 햄버거 메뉴를 누르면 반응할 뷰 추가
	NavigationUI.setupWithNavController(binding.navView, navController)

	// 네비게이션 화면 전환이 이루어졌을때 호출되는 리스너
	navController.addOnDestinationChangedListener{
		controller: NavController, destination: NavDestination, arguments: Bundle? -> 
		
		// destination.id : 현재 진입된 GRAPH ID (네비게이션에 추가된 화면 ID)
		// controller.graph.startDestination : 네비게이션에 startDestination 으로 명시된 id
		// 또는 destination.id == R.id.graph id (네비게이션에 추가된 화면 ID)
		if (destination.id == controller.graph.startDestination) {
			// 유저가 화면을 스와이프할때 메뉴가 열리도록 한다.
			drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
		} else {
			// 유저가 화면을 스와이프할때 메뉴가 열리지 않도록 한다.
			drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
		}
	}
}

 

2. 설명

  1) addOnaddOnDestinationChangedListener 으로 화면 전환이 이루어졌을때, 진입한 그래프 ID로 비교해서 메뉴 오픈을 LOCK 또는 UNLOCK 한다.

 

  2) controller.graph.startDestination 은 아래 네비게이션 xml 에서 찾아볼 수 있다.

Navigation에 명시된 startDestination

 

반응형