2014-07-14 16 views
2

我有ViewPagerPagerSlidingTabStripActivity爲我ViewPager每一頁都有fragment,並在每個fragment實現的http request(使用Volley)加載來自頁面的數據,但是當請求結束時出現錯誤,輸入timeout或者失去連接時,我需要顯示一個對話框,並用選項重做對服務器的調用,防止出現多個對話框的問題,爲每個錯誤打開解決與片段:安卓:避免打開對話框幾次,但允許隱藏和顯示相同的對話框

在此處查看此解決方案:http://www.jorgecoca.com/android-quick-tip-avoid-opening-multiple-dialogs-when-tapping-an-element/

@Override 
public void show(FragmentManager manager, String tag) { 
    if (manager.findFragmentByTag(tag) == null) { 
     super.show(manager, tag); 
    } 
} 

當用戶單擊dialog button再次嘗試,並關閉對話框並檢查是否有互聯網連接,如果我沒有,對話框應該再次打開,但對話框不會再次顯示,我相信標籤不會被釋放到FragmentManager

守則Activity

final Button mButton = (Button) this.findViewById(R.id.btn_opendialog); 

final DialogFragmentHelper mDialog = new DialogFragmentHelper(); 
mDialog.setCallbackListener(new OnCallback() { 

    @Override 
    public void onCancel() { 

    } 

    @Override 
    public void onConfirm() { 

     // verify if network available 

     mDialog.show(MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG); 
    } 
}); 

mButton.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(final View v) { 

     mDialog.show(MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG); 
    } 
}); 

會有人有解決辦法的建議?

回答

1

爲了保持這是在我的項目準備好了結構,還留着一些更接近我的目標,這是用任何標誌,也沒有通過第三dialogfragment管理的控制,來到因此需要一個小時的解決方案。

DialogFragmentHelper mDialog = new DialogFragmentHelper(); 
mDialog.setCallbackListener(new OnCallback() { 

    @Override 
    public void onCancel() {} 

    @Override 
    public void onConfirm() { 

     mDialog.dismissAllowingStateLoss(); 

     if(networkAvailable == false){ 

      new Handler().post(new Runnable() { 

       @Override 
       public void run() { 
        mDialog.show(MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG); 
       } 
      }); 

     }else { 
      //do something here 
     } 
    } 
}); 

這樣,我保證,而一些請求發送到打開dialogfragment,只有第一個被執行,並關閉dialogfragment,我能很快再次,如果需要打開它,可以在我的情況發生正在工作。

1

你可以用單身控制器來處理它。例如:

package com.example.stackoverflowsandbox; 

public class MyDialogController { 
    private static MyDialogController instance; 

    public static MyDialogController getInstance() { 
     if (MyDialogController.instance == null) { 
      MyDialogController.instance = new MyDialogController(); 
     } 

     return MyDialogController.instance; 
    } 

    private boolean dialogOpenned; 

    private MyDialogController() {} 

    public void closeDialog() { 
     if (this.dialogOpenned) { 
      this.dialogOpenned = false; 

      // you close code... 
     } 
    } 

    public void openDialog() { 
     if (!this.dialogOpenned) { 
      this.dialogOpenned = true; 

      // your open code... 
     } 
    } 
} 
+1

,我對這個問題並不清楚,但是這樣可以解決是的,謝謝! –