2016-11-11 6 views
1

Androidの開発とAndroidのデフォルトのナビゲーション引き出しレイアウトを使用してアプリケーションを開発するのが初めてです。AndroidのonBackPressedで前の断片に戻る

私はアプリケーションでフラグメントを使用しています。

次のフラグメントで戻るボタンを押すと、前のフラグメントに戻りたいと思います。 onBackPress閉じる引き出し

  • 次のフラグメントにするときfragment1

    のナビゲーション引き出しはダブルバックプレスに終了アプリ

  • 開いているときとき

    1. が戻って、以前のフラグメントに取得し、以下の機能を実装する必要があります。 これは私のコードがMainActivityにあるのです 新しいフラグメントを作成中に

      // replacing the fragment 
      if (fragment != null) { 
          FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
          ft.replace(R.id.content_frame, fragment); 
          ft.commit(); 
      } 
      

      onBackPress

      @Override 
      public void onBackPressed() { 
          DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
          if (drawer.isDrawerOpen(GravityCompat.START)) { 
           drawer.closeDrawer(GravityCompat.START); 
          } else if (getFragmentManager().getBackStackEntryCount() > 0) { 
           FragmentManager fm = getSupportFragmentManager(); 
           fm.popBackStack(); 
          } else { 
           super.onBackPressed(); 
          } 
      } 
      

      しかし、これは作業や背中を押すにはされていないが、ナビゲーション引き出しが、それが閉じている開いている場合を除き、アプリケーションを終了します。

    答えて

    1

    バックスタックにフラグメントを追加していません。あなただけの

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    .replace(R.id.content_frame, fragment); 
    .addToBackStack(null); 
    .commit(); 
    

    を行うこととBackstackが実際にバックボタンによって処理されますので、あなただけにそれを変更することができますので、あなたは、onBackPressed()でこのシナリオを処理する必要はありませんがあります。

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

    '.addToBackStack(null);'が追加されていません。この行を追加した後、最初の[戻る]ボタンを押しても何も起こりません.2回目のクリックでアプリケーションが終了します –

    0

    お客様のFragmentTransactionFragmentをバックスタックに追加する必要があります。

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.replace(R.id.content_frame, fragment).addtoBackStack(null).commit(); 
    

    タグを与えることによって、それらはすべてそのタグによってグループ化されます。だからあなたが一緒にそれらを閉じる必要がある場合はそうするか、特定のものに移動することができます。

    私はreplace()も使用しません。なぜなら、そのバックスタックは非常にバグが多いからです。

    remove()、次にadd()を使用してください。

    0

    あなたはこの方法をバックスタックにあなたのフラグメントを追加し、コードを変更する必要があります

    // this variable is needed to know how many times the back key has been pressed. 
    // It is incremented and reset accordingly to the logic you described 
    int mBackPressCount = 0; 
    
    @Override 
    public void onBackPressed() { 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
        if (drawer.isDrawerOpen(GravityCompat.START)) { 
         drawer.closeDrawer(GravityCompat.START); 
        } else { 
         if (getFragmentManager().getBackStackEntryCount() == 0) { 
          // if there are no fragments in your back stack check the mBackPressCount 
          if (mBackPressCount++ > 0) { 
           // if you pressed back for the second time this line will terminate the activity 
           super.onBackPressed(); 
          } 
         } else { 
          // this line will pop the fragment from the back stack, 
          // no need to pop it manually 
          super.onBackPressed(); 
         } 
        } 
    } 
    

    はバックスタックにフラグメントを追加します。

    if (fragment != null) { 
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.replace(R.id.content_frame, fragment); 
        ft.addToBackStack(null); 
        ft.commit(); 
    
        // when you add a fragment you should reset the back press count 
        mBackPressCount = 0; 
    } 
    

    引き出しを開いて閉じたときにmBackPressCountをリセットします。バックキーを1回押して引き出しを開くと、カウンタは再び0に設定されなければなりません。

    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { 
        @Override 
        public void onDrawerSlide(View drawerView, float slideOffset) { 
    
        } 
    
        @Override 
        public void onDrawerOpened(View drawerView) { 
         mBackPressCount = 0; 
        } 
    
        @Override 
        public void onDrawerClosed(View drawerView) { 
         mBackPressCount = 0; 
        } 
    
        @Override 
        public void onDrawerStateChanged(int newState) { 
    
        } 
    }); 
    
    +0

    3番目のコードセグメントはどこに挿入されますか? 'drawerLayout'は' DrawerLayout'のオブジェクトですか? –

    +0

    をonCreateメソッドに入れることができます。スニペットを修正しました。しかし、私はこれらのfindViewById呼び出し(https://developer.android.com/topic/libraries/data-binding/index.html)を避けるためにデータバインディングを使用することを提案します – Massimo

    +0

    私はあなたが言ったことをしましたが、2番目の断片3回のバックプレスを受け入れ、何も起こらず、3回目のキーを押すと、アプリケーションは –