2016-11-17 24 views
2

我剛剛意識到smartlock api不允許我在爲Android應用重構時將片段傳遞給ResolvingResultCallbacks對象。如何使用片段啓動Smartlock保存而不是使用活動

該API只允許我傳遞Activity作爲上下文,這意味着我需要處理Activity的onActivityResult()方法而不是Fragment的憑據結果。但在我們應用程序的當前設計中,我們希望片段處理智能鎖邏輯。

這裏是我的代碼保存:

Auth.CredentialsApi.save(mSmartLockApiClient, credential).setResultCallback(
    new ResolvingResultCallbacks<Status>(mActivity, RC_CREDENTIALS_SAVE) { 
     @Override 
     public void onSuccess(Status status) {        
     mSmartLockSaveCallBack.onSuccess(); 
     } 

     @Override 
     public void onUnresolvableFailure(Status status) {} 
    }); 

實際請求的憑據,我有同樣的問題,該API犯規提供一種方式來傳遞片段開始的分辨率。但我找到一個解決辦法:

if (status.hasResolution()) { 
    mFragment.startIntentSenderForResult(
     status.getResolution().getIntentSender(), 
     RC_CREDENTIALS_READ, 
     null, 
     0, 
     0, 
     0, 
     null); 
} 

回答

3

我同意,這是令人失望的是ResolvingResultCallbacks不直接支持片段,但實際上執行是非常簡單的。下面是支持片段的變體:

public abstract class ResolvingResultCallbacks<R extends Result> 
    extends ResultCallbacks<R> { 
    private static final String TAG = "ResolvingResultCallback"; 

    private final Fragment mFragment; 
    private final int mRequestCode; 

    protected ResolvingResultCallbacks(
     @NonNull Fragment fragment, 
     int requestCode) { 
    mFragment = fragment; 
    mRequestCode = requestCode; 
    } 

    @Override 
    public final void onFailure(@NonNull Status result) { 
    if (result.hasResolution()) { 
     try { 
     mFragment.startIntentSenderForResult(
      result.getResolution().getIntentSender(), 
      mRequestCode, 
      null, // fillInIntent, 
      0, // flagsMask, 
      0, // flagsValues 
      0, // extraFlags 
      null); // options 
     } catch (IntentSender.SendIntentException ex) { 
     Log.e(TAG, "Failed to start resolution", ex); 
     onUnresolvableFailure(
      new Status(CommonStatusCodes.INTERNAL_ERROR)); 
     } 
    } else { 
     onUnresolvableFailure(result); 
    } 
    } 

    @Override 
    public abstract void onSuccess(@NonNull R result); 

    @Override 
    public abstract void onUnresolvableFailure(@NonNull Status result); 
} 

startIntentSenderForResult才被加入到API V24本地Fragment類型,所以你可能會需要使用支持Fragment實現代替。

我沒有測試過,所以請讓我知道它是否適合您。

+0

謝謝!它工作得很好。除非你錯過了mFragment.startIntentSenderForResult中的一些參數。 XD – Qing

+0

感謝您告訴我,我現在糾正了它。 – iainmcgin

相關問題