2017-12-12 4 views
1

나는 필요한 응용 프로그램을 만들고 있습니다 Navigation Drawer.이 응용 프로그램에는 1 개의 MainActivity와 약 10 개의 조각이 있습니다. MainActivity에서 Navigation Drawer 아이콘을 클릭하면 10 fragments이 표시되어 각각을 선택할 수 있습니다.뒤로 버튼 조작기

fragment A를 선택한 다음 B를 누른 다음 C ... F를 선택합니다. 내가 fragment F에 있고 뒤로 버튼을 누르면, 다시 fragment E로 데려 갈 것이고, 다시 내가 다시 fragment D로 걸릴 것입니다 ... 내가 다시 버튼을 누르면 내가 필요합니다. fragment 필요합니다. 기본 가정으로 navigationdrawer로 이동하십시오.

나는에 대한 검색했습니다 SO 1 개 비슷한 질문을 찾았지만 아직 대답은 그래서

+0

시도하셨습니까? '시도 { activity.getSupportFragmentManager(). popBackStackImmediate (null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } catch (IllegalStateException e) { e.printStackTrace(); }' –

+2

당신은 프래그먼트를 추가하고 있는데, 다시 스택에 추가되는 이유입니다. 각 조각을 바꿔서 다시 누르면 네비게이션 서랍으로 이동합니다. https://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack –

+0

관련 코드 공유. –

답변

2

안녕이 추가 getFragmentManager()의

그리고 그 시점에서 백 프레스를 수행 할 때 다음 코드를 조각이 포함 된 활동에 넣으십시오.

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 

이 답변을 통해 도움이되고 문제를 해결할 수 있기를 바랍니다.

+0

그것은 나를 위해 일했다, thanks :) –

+0

감사합니다 Mayur Chauhan :) –

1

당신이 당신의 FragmentsbackStack를 추가하지 않습니다이 경우

try { 
    activity.getSupportFragmentManager().popBackStackImmediate(n‌​ull,FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } catch (IllegalStateException e) 
    { 
    e.printStackTrace(); 
    } 
1

을 시도 했 또 다른 질문을 할 필요가 없습니다 . onBackPressed()에 팝업을 원하지 않으면 각 fragment을 교체하십시오.

getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, new AFragment()).commit(); 

핸들 onBackPressed() :

@Override 
public void onBackPressed() { 
    Fragment frag = getSupportFragmentManager().findFragmentById(R.id.containerFrame); 
    if (frag instanceof HomeFragment) { 
     // DO Onbackpress 
     finish(); 
    } else { 
     HomeFragment fragment = new HomeFragment() 
     getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, fragment).commit(); 
    } 
} 
-1

이 매니페스트 에서이 시도는 나는 당신이 시도 할 수 있다고 생각 그것은 당신에게 >

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Frame1" 
      android:label="@string/frame_1" 
      android:parentActivityName=".MainActivity"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.webservice.appname.MainActivity" /> 
     </activity> 
     <activity 
      android:name=".Frame2" 
      android:label="@string/frame_2" 
      android:parentActivityName=".MainActivity"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.webservice.appname.MainActivity" /> 
     </activity> 
     <activity 
      android:name=".Frame3" 
      android:label="@string/frame_3" 
      android:parentActivityName=".MainActivity"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.webservice.appname.MainActivity" /> 
     </activity> 
     . 
     . 
     . 
     . 
     . 
</application> 
+0

프래그먼트에서 뒤로 버튼을 호출 할 때 주 본체에서 걸릴 수 있습니다. –

+0

매니페스트에 단편을 추가 할 필요가 없습니다. 위에서 선언 한 매니페스트는 조각이 아닌 활동이 있음을 분명히 말합니다. –

2

도움이 될 것입니다 생각합니다. 당신이 supportFragment 다음 장소에서 getSupportFragmentManager()를 사용하여 사용하는 경우

fragmentManager = getFragmentManager(); 
fragmentTransaction = fragmentManager.beginTransaction(); 

if (fragmentA == null) 
    fragmentA = new FragmentA(); 

fragmentTransaction.replace(R.id.container, fragmentA); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commitAllowingStateLoss(); 

:

나는 조각을 변경하는 코드 아래 사용하고, 아래에있는 내 솔루션은 onBackPressed()

if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) { 
      getSupportFragmentManager().popBackStack(); 
     } 
    } else { 
     super.onBackPressed(); 

    } 
1
* The purpose of this method is set The current display ui 
* 
* @param id the ui that has to be displayed 
*/ 
public void setDisplay(int id) { 
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
     mDrawerLayout.closeDrawer(GravityCompat.START); 
    } 

    HideKeyboard.hideKeyboard(HomepageActivity.this); 
    Intent intent; 
    switch (id) { 
     //Open up home fragment 
     case AppConstants.DISPLAY_HOME: 
      if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) { 
       mFragment = new FragmentHome(); 
       replaceFragment(mFragment, AppConstants.HOME_FRAGMENT); 
      } 
      break; 
     //opens up the setting section 
     case AppConstants.DISPLAY_SETTING: 
      if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentSetting)) { 
       mFragment = new FragmentSetting(); 
       replaceFragment(mFragment, AppConstants.SETTING_FRAGMENT); 
      } 
      break; 
     //display the logout dialog 
     case AppConstants.DISPLAY_LOGOUT: 
      DialogManager.getInstance().showLogOutLogOut(this); 
      break; 
     //display the notification section 
     case AppConstants.DISPLAY_NOTIFICATION: 
      if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentNotification)) { 
       mFragment = new FragmentNotification(); 
       replaceFragment(mFragment, AppConstants.NOTIFICATION_FRAGMENT); 
      } 
      break; 

     default: 
      //Setup Home Fragment as default fragment 
      if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) { 
       mFragment = new FragmentHome(); 
       replaceFragment(mFragment, AppConstants.HOME_FRAGMENT); 
      } 
      break; 
    } 
} 

/* * 기존 mFragment에게 * * @param 단편 @param 단편 */

public void replaceFragment(final Fragment fragment, final String name) { 
      if(mFragmentManager.findFragmentById(R.id.fragment_container)instanceof FragmentHome) { 
       mFragmentManager.beginTransaction() 
         .replace(R.id.fragment_container, fragment, name) 
         .addToBackStack(name) 
         .commit(); 
      } else { 
       mFragmentManager.beginTransaction() 
         .replace(R.id.fragment_container, fragment). 
         commit(); 
      } 
     } 
의 태그 이름 * 교체되어야하는 단편을 대체하여 mFragment 삽입

/ ** *이 방법의 목적은 스택에서 */ 공개 무효 removeFragmentFromStack() {

0,123 단편을 제거한다
if (mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome) { 
     exitFromApp(); 
    } else { 
     mFragmentManager.popBackStackImmediate(); 

    } 
} 
1

다음 코드를 사용해보십시오.

rootView.setFocusableInTouchMode(true); 
    rootView.requestFocus(); 
    rootView.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       if (keyCode == KeyEvent.KEYCODE_BACK) { 

        final Intent startIntent = new Intent(context, MainActivity.class); 
        startIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
        startActivity(startIntent); 
        getActivity().finish(); 

      } 
      } 
      return false; 
     } 
    }); 
    return rootView;