728x90
반응형
이상하게 Fragment를 전환해도 햄버거 버튼이 그대로 남아있다
안드로이드에서 제공한 Navigation Drawer Activity에서는 뒤로가기로 바뀌던데...
setDisplayHomeAsUpEnabled
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
위 코드를 추가하면 바뀌기는 하지만 모양만 바뀔 뿐더러 다시 돌아가지도 않는다...
유튜브에서 해답을 찾을 수 있었다
https://www.youtube.com/watch?v=O11d_N9_VVQ&t=62s
최종코드는 아래와 같다
package com.lektion.gympartner;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.navigation.NavigationView;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, FragmentManager.OnBackStackChangedListener{
private DrawerLayout drawer;
private ActionBarDrawerToggle toggle;
NavigationView navigationView;
boolean mToolBarNavigationListenerIsRegistered = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawer = findViewById(R.id.drawer_layout);
navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
getSupportFragmentManager().addOnBackStackChangedListener(this);
displayHomeUpOrHamburger();
if (savedInstanceState == null)
{
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new homeFragment()).commit();
resetSelectedItem();
}
}
private void displayHomeUpOrHamburger()
{
boolean upBtn = getSupportFragmentManager().getBackStackEntryCount() > 0;
if(upBtn)
{
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
toggle.setDrawerIndicatorEnabled(false);
if(!mToolBarNavigationListenerIsRegistered)
{
toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getSupportFragmentManager().popBackStackImmediate();
}
});
mToolBarNavigationListenerIsRegistered = true;
}
}
else
{
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
toggle.setDrawerIndicatorEnabled(true);
toggle.setToolbarNavigationClickListener(null);
mToolBarNavigationListenerIsRegistered = false;
}
}
public void setActionBarTitle(String title)
{
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setTitle(title);
}
}
public void resetSelectedItem()
{
int size = navigationView.getMenu().size();
for (int i = 0; i < size; i++) {
navigationView.getMenu().getItem(i).setChecked(false);
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId())
{
case R.id.nav_userinfo:
//getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new userInfoFragment()).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new userInfoFragment()).addToBackStack(null).commit();
break;
case R.id.nav_list:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new listFragment()).addToBackStack(null).commit();
break;
case R.id.nav_addexercise:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new addExerciseFragment()).addToBackStack(null).commit();
break;
case R.id.nav_addroutine:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new addRoutineFragment()).addToBackStack(null).commit();
break;
case R.id.nav_statistics:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new statisticsFragment()).addToBackStack(null).commit();
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onBackStackChanged() {
displayHomeUpOrHamburger();
}
@Override
public void onBackPressed() {
if(drawer.isDrawerOpen(GravityCompat.START))
{
drawer.closeDrawer(GravityCompat.START);
}
if(getSupportFragmentManager().getBackStackEntryCount() > 0)
{
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new homeFragment()).commit();
}
else
{
super.onBackPressed();
}
}
}
먼저 FragmentManger.OnBackStackChangedListner를 implements 한다
그리고 관련 함수 작성
BackStack은 얼마나 Fragment를 이동했는지에 대한 기록 같은 거다
화면 전환한 횟수 같은 느낌?
그래서 만약 화면 전환이 1번 이상 되었다면 Home이 아닌 다른 화면이므로 BackButton를 활성화한다
그리고 버튼을 눌럿을때 popBackStackImmediate를 호출하여 이전 Fragment(Home)으로 돌아간다
이 함수를 onBackStackChanged()에 넣어준다
이름에서 알 수 있듯이 화면전환 횟수가 변경되면 실행한다
또 뒤로가기를 눌렀을 때도 Home으로 돌아가기 위해 onBackPresssed에도 추가
'중단된 프로젝트 > GYM Partner' 카테고리의 다른 글
헬스 루틴 기록용 앱 만들기#4 - 유저정보 (0) | 2021.08.17 |
---|---|
헬스 루틴 기록용 앱 만들기 - Navigation View 선택 해제 (0) | 2021.08.11 |
헬스 루틴 기록용 앱 만들기#3 - 화면전환 (0) | 2021.08.11 |
헬스 루틴 기록용 앱 만들기 - 프로젝트 리팩토링 (0) | 2021.08.09 |
헬스 루틴 기록용 앱 만들기#2 - 홈 화면 (0) | 2021.08.05 |