2017-11-10 6 views
1

내 앱에 하나의 빈 활동과 몇 개의 조각이 포함되어 있습니다. 활동의 onCreateactivity_main.xml의 빈보기를 일부 버튼이 포함 된 MainFragment으로 바꿉니다. 각 버튼은 별도의 조각을 실행하고 사용자는 한 조각에서 다른 조각으로 이동할 수 있습니다.조각으로 만 활동하기

MainFragment에 도달 할 때까지 현재 조각을 이전 조각으로 올바르게 바꿉니다. 사용자가 MainFragment에서 다시 누르면 주요 부분이 숨겨지고 기본 활동의 흰색 빈 배경이 표시됩니다. 그러나 나는이 시점에서 활동에서 벗어나고 싶다. 그것은 현명한 행동이기 때문이다.

조각 관리자에 조각이 남아 있지 않으면 onBackPressed에서 super.onBackPressed()를 두 번 호출하여이 작업을 수행 할 수 있습니다.

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    FragmentManager manager = getSupportFragmentManager(); 
    List<Fragment> fragments = manager.getFragments(); 
    if (fragments == null || fragments.size() == 0) { 
     Log.d(TAG, "No more fragments: exit"); 
     super.onBackPressed(); 
    } 
} 

허용되는 작업 - 활동 워크 플로에 문제가 있습니까? 이 시나리오를 처리하는 더 나은/표준 방법이 있습니까?

+0

PS : 이전에는 프래그먼트 대신 activity_main.xml에 버튼 목록이 있었지만 다른 프래그먼트의 빈 영역을 만지면 버튼에 클릭 이벤트가 발생했습니다. 활동. 이 문제를 피하려면 모든 조각에서'clickable = true'를 사용해야합니다. 나는 초기 화면조차도 조각을 사용하여 이것을 처리 할 것이라고 생각했다. – Amarghosh

+0

첫 번째 호출을 제거하십시오 : super.onBackPressed(); ... if 문 안쪽에 하나만 남겨 두십시오. – W0rmH0le

답변

1

그렇게 아무 문제가 없지만, 당신이 활동의 ​​주요 조각을 추가 할 때 당신은 정말 당신의 활동에 onBackPressed를 오버라이드 (override) 할 필요가 없습니다 .addToBackStack()

+0

올바른 해결책입니다. 이제 onBackPressed를 재정의 할 필요가 없습니다. 고맙습니다. – Amarghosh

0

를 호출하지 않으면 아마 쉬울 것입니다. 나는 당신의 활동에 조각을 추가하는 방법을 구현하는 제안 :

protected void addFragment(Fragment fragment, boolean addToBackStack) { 
    String tag = fragment.getClass().getName(); //It's optional, may be null 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction() 
      .add(R.id.your_container_id, fragment, tag); 

    if (addToBackStack) { 
     transaction.addToBackStack(tag); 
    } 

    transaction.commit(); 
} 

을 그리고 다음 코드에서와 같이 활동하여 onCreate 방법을 수정 : 다른 모든 조각의 경우

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (savedInstanceState == null) { 
     // Add your fragment only if it is a first launch, 
     // otherwise it will be restored by system 
     addFragment(new YourFirstFragment(), false); 
    } 
} 

은 사용

addFragment(new OtherFragment(), true);