2016-11-11 73 views
1

我是新來Android開發和開發應用程序使用Android的默認導航抽屜佈局。回到上一個關於onBackPressed的片段Android

我在應用程序中使用片段。

我想在下一個片段上按下後退按鈕時回到上一個片段。 的onBackPress必須實現以下功能

  1. 找回以前的片段上的一個片段時
  2. 關閉抽屜時,導航抽屜是打開的片段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(); 
    

    而且,由於返回堆棧實際上是由後退按鈕來處理,你不需要在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);'不起作用。添加這一行後,在第一次按返回按鈕時,沒有任何反應,然後再次點擊應用程序退出 –

    0

    您必須將FragmentTransaction中的Fragment添加到後臺。

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

    通過爲標記null他們都獲得由標籤分組。所以如果你需要一起關閉它們,你可以這樣做或導航到某個特定的一個。

    我也不會使用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。如果您一旦按下後退鍵並打開抽屜,計數器必須再次設置爲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

    插入第三個代碼段的位置? 'drawerLayout'是'DrawerLayout'的對象嗎? –

    +0

    你可以把它放在onCreate方法中。修改了片段。不過,我建議使用數據綁定,以避免所有這些findViewById調用(https://developer.android.com/topic/libraries/data-binding/index.html) – Massimo

    +0

    我做了你所說的,但在第二個片段它正在接受3次背按並且沒有任何反應,第3次按鍵時,應用程序退出 –