2017-07-10 3 views
0

私はAndroidの初心者です。私はアクティビティを通して複数のフラグメントを使用したアプリケーションを開発しています。複数のフラグメントでonBackPressed()を処理する方法

private void displaySelectedScreen(int itemId) { 
     Fragment fragment = null; 
     switch (itemId) { 

      case R.id.nav_home: 
       fragment = new HomeFragment(); 
       break; 

      case R.id.nav_attendance: 
       fragment = new AttendanceFragment(); 
       break; 

      case R.id.nav_notification: 
       fragment = new NotificationFragment(); 
       break; 

      case R.id.nav_event: 
       fragment = new EventFragment(); 
       break; 

      case R.id.nav_fee: 
       fragment = new FeesFragment(); 
       break; 

      case R.id.nav_news: 
       fragment = new NewsFragment(); 
       break; 

     } 
     if (fragment != null) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.frame_container, fragment); 
      ft.addToBackStack(null); 
      ft.commit(); 
     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 

    } 

及び引き出しが既に近い場合、アプリケーションを閉じるために、onBackPressed()方法を使用。現在のフラグメントがHomeFragmentである場合にアプリケーションを終了し、現在のフラグメントがHomeFragmentでない場合は、HomeFragmentで置き換えます。私は知らない、どうしてるの?

public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     closeApp(); 
    } 
} 
+0

ボタンを押すとバック​​されたときの断片の数を確認してください。 0番目のフラグメントに達するまで、スタックからフラグメントをポップします。スタックのサイズが0かどうかを確認する条件を確認します。はいの場合は、アクティビティを終了します。 – SripadRaj

答えて

1

フラグメントにタグを追加できます。このようにして、タグ名を確認するだけです。

Fragment fragment = new Fragment(); 
getFragmentManager().beginTransaction() 
    .replace(R.id.FrameLayoutId,fragment,"TAG_NAME") 
    .addToBackStack("SOURCE_TAG_NAME").commit(); 

これはちょうどあなたのHomeFragment.javaに移動し、メソッドを編集、アクティビティやごcloseApp()方法簡単なために

function void closeApp(){ 
    Fragment fragment = getFragmentManager().findFragmentByTag("HomeActivity"); 
    if (fragment != null) { 
     if(fragment.isVisible()){ 
      HomeActivity.this.finish(); 
     } 
    } 
} 
+0

ありがとう、それは動作します。 –

0

であなたのbackpress方法でこのチェックを入れて、あなたのフラグメントのタグをチェックする方法でありますonBackPressed()を使用してアプリケーションを終了するには、finish()を使用します。
などFragment.javaため、ちょうどあなたがここでそれを検索することができ、popBackStack()機能を使用する:あなたのMainActivityクラスのオーバーライドonBackPressedと、このようなそこに表示ダイアログボックスの https://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

0

:各Fragment

@Override 
public void onBackPressed() { 
    //show dialog box here 
} 

onResume()メソッドを次のコードで実装します。

 @Override 
    public void onResume() { 
     super.onResume(); 
     getView().setFocusableInTouchMode(true); 
     getView().requestFocus(); 
     getView().setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ 
       //homefragment class name  
       Class fragmentClass = HomeFragment.class; 

      try { 

      Fragment fragment = (Fragment) fragmentClass.newInstance(); 
      FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
         fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return true; 

       } 

       return false; 
      } 
     }); 
    } 
1

このコードは、NavigationActivityのBackPressed()メソッドで使用します。私はあなたが解決できることを願っています。

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     Fragment f = getVisibleFragment();// to get which fragment now 
     if (f.getClass() != MainFragment.class) { 
      Fragment fragment = null; 
      try { 
       fragment = (Fragment) MainFragment.class.newInstance(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit(); // this is your framelayout 
     }else { 
      super.onBackPressed(); 
     } 

    } 
} 

getVisibleFragment()関数

public Fragment getVisibleFragment() { 
    FragmentManager fragmentManager = NavigationActivity.this.getSupportFragmentManager(); 
    List<Fragment> fragments = fragmentManager.getFragments(); 
    if (fragments != null) { 
     for (Fragment fragment : fragments) { 
      if (fragment != null && fragment.isVisible()) 
       return fragment; 
     } 
    } 
    return null; 
} 
関連する問題