2017-12-12 24 views
1

私は必要なアプリケーションに取り組んでいますNavigation Drawer.このアプリケーションには1つのMainActivityと約10個のフラグメントがあります。 MainActivityでNavigation Drawerアイコンをクリックすると10 fragmentsが表示されますので、それぞれを選択できます。戻るボタンが押されたハンドラ

fragment A、次にB、C ... Fなどを選択します。私がfragment Fにいて、戻るボタンを押すと、それはfragment Eに戻ってきます。それから私はfragmentに戻ります。 私が必要なのは、私が戻るボタンを押したときです。fragmentデフォルトの家にnavigationdrawerで行ってください。

私はbackStackにごFragmentsを追加しないように検索すると1つの同様の質問を見つけましたが、まだ私は別の質問

+0

試しましたか? 'try { 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

これを追加:supportFragmentを使用している場合

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

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

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

その後、所定の位置にgetSupportFragmentManager()を使用getFragmentManager()の

そして、その時にバックプレスを実行するときには、断片を含むあなたのアクティビティに以下のコードを入れてください。

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

この回答をお寄せいただきありがとうございます。

+0

それは私のために働いた、ありがとう:) –

+0

ありがとうMayur Chauhan :) –

1

をしなければならない何の答えはあなたがこの場合

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

を助けるだろうと思い、あなたのマニフェスト ではこれを試してみてください。私は、フラグメントを変更するには、コードの下に使用しています、以下こんにちは、私の解決策である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; 
    } 
} 

/* * @paramを交換しなければならないの断片を断片化* * 既存mFragment を交換することによりmFragmentを挿入 * @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(); 
      } 
     } 
のタグに名前を付けます

/** *この方法の目的は、スタックから */ 公共ボイドremoveFragmentFromStack(){

0123断片を除去することです
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; 
関連する問題