0

我正在創建一個對話框,彈出確認用戶是否退出該頁面。如何在Android中的片段onBackPress對話框?

在過去,我使用的活動,所以它沒有問題。我只需要將對話框放在覆蓋onBackPress函數中,如果用戶選擇離開,則調用finish()

但是,目前我想將該類切換到tabhost內的片段。所以不僅我需要處理onbackpress,而且當用戶單擊選項卡欄切換到其他選項卡時也是如此。

我想:

@Override 
public void onDetach() { 
    AlertDialog.Builder builder = new Builder(ctx); 
    builder.setMessage(getResources().getString(R.string.quit_form)); 
    builder.setNegativeButton(getResources().getString(R.string.yes), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        File directory = new File(Constant.upload_imageFolder); 
        File[] files = directory.listFiles(); 
        for (int i = 0; i < files.length; ++i) { 
         files[i].delete(); 
        } 
        UploadForm.super.onDetach(); 
       } 
      }); 
    builder.setPositiveButton(getResources().getString(R.string.no), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
    builder.create().show(); 
} 

但它崩潰。如何解決這個問題?並且是onDetach正確的函數來覆蓋?非常感謝。

更新: 異常時ondetach:

android.support.v4.app.SuperNotCalledException: Fragment UploadForm{42db9eb0 #3 id=0x7f050075} did not call through to super.onDetach() 
+1

什麼是錯誤?如果你用'onBackPressed'替換'onDetach',它是否工作?編輯看看我發現[鏈接](http://stackoverflow.com/a/25574198/4385913)它有幫助嗎? – 2015-02-11 08:14:15

+0

onBackPressed無法處理按菜單選項卡上的情況,並更改選項卡 – user782104 2015-02-11 08:20:14

+0

那麼如果你嘗試使用'setKeyListenerOnView'像[this](http://stackoverflow.com/a/27055873/4385913)? – 2015-02-11 08:21:35

回答

2

您需要重寫onBackPressed()的活動。並在提交之前使所有FragmentTransaction都是addToBackStack。

@Override public void onBackPressed() { 
    int count = getFragmentManager().getBackStackEntryCount(); 

    if (count == 0) { 
     super.onBackPressed(); 
     //additional code 
    } else { 
     getFragmentManager().popBackStack(); 
    } 
} 

儘管上述方法適用於添加到背堆棧的所有片段。您也可以自定義它以遵循模式。

  1. 創建的接口,如BackNavigable(由那些想消費背壓誰片段實現),用方法boolean consumeBackPress();
  2. 對於那些想消耗回來新聞發佈會返回從實現真正的誰片段。
  3. 現在在活動onBackPressed()中查看當前片段,並檢查該片段是否是BackNavigable的實例,並在其consumeBackPress()實現中返回true。如果是,則彈出該片段,否則請調用super.onBackPressed()的活動。

就是這樣。

+0

非常感謝,當我按下菜單標籤欄上的標籤更改如何? – user782104 2015-02-11 09:13:39

+0

對於選項卡,只需使用子Fragment Manager而不是FragmentManager來實現相同的邏輯。 – 2015-02-11 13:28:23