2015-06-29 29 views
1

我有一個類從dialogfragment繼承:打開對話框片段中的活動是否會取消對話框片段?

import org.xwalk.core.*; 
// ... 

public class WebViewDialogFragment extends DialogFragment { 
    private XWalkView webView; 
    public static final String LOG_TAG = "WebViewDialogFragment"; 

    private String url; 
    private WebViewJavascriptInterface javaScriptInterface; 

    // The constructor I use to set the url. 
    public WebViewDialogFragment(String url, WebViewJavascriptInterface javascriptInterface) { 
     this.url = url; 
    } 

    public WebViewDialogFragment() { 
     Log.d(LOG_TAG, "WebViewDialogFragment empty constructor was called."); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(LOG_TAG, "Setting fullscreen mode"); 
     setStyle(DialogFragment.STYLE_NORMAL, R.style.SagoBizWebViewFullScreenTheme); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.d(LOG_TAG, "Setting Xwalkview"); 
     webView = new XWalkView(getActivity(), getActivity()); 
     webView.clearCache(true); 
     Log.d(LOG_TAG, "Loading the url: " + url); 
     webView.load(url, null); 
     return webView; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     Dialog dialog = getDialog(); 
     if (dialog != null) { 
      int width = ViewGroup.LayoutParams.MATCH_PARENT; 
      int height = ViewGroup.LayoutParams.MATCH_PARENT; 
      dialog.getWindow().setLayout(width, height); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (webView != null) { 
      webView.pauseTimers(); 
      webView.onHide(); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (webView != null) { 
      webView.resumeTimers(); 
      webView.onShow(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (webView != null) { 
      webView.onDestroy(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (webView != null) { 
      webView.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
} 

我還有另一個階級誰擁有類型WebViewDialogFragment的成員:

public class WebView { 
    protected static final String DIALOG_FRAGMENT_TAG = "WebViewDialogFragment"; 

    protected Activity activity; 
    protected String dialogFragmentTag = DIALOG_FRAGMENT_TAG; 
    protected WebViewDialogFragment webViewDialogFragment; 

    public WebView(Activity activity) { 
     this.activity = activity; 
    } 

    public void display(final String url) { 
     Log.d("TEST", "WebView display"); 

     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       webViewDialogFragment = new WebViewDialogFragment(url, getWebViewJavascriptInterface()); 

       if (webViewDialogFragment != null) { 
        FragmentManager fm; 
        fm = activity.getFragmentManager(); 
        Log.d("TEST", "Showing webview"); 
        webViewDialogFragment.show(fm, WebView.this.dialogFragmentTag); 
       } else { 
        Log.e("TEST", "webViewDialogFragment is null"); 
       } 
      } 
     }); 
    } 

} 

我所說的顯示器(字符串URL)的WebView的方法來顯示即將顯示webview的對話框。

使用@javascriptinterface屬性我創建了webview javascript和原生java之間的橋樑,以便我可以在dialogfragment中打開外部瀏覽器(或存儲)。 JavaScript的接口有像這樣的方法:

@JavascriptInterface 
public void urlExternalAction(string url) { 
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    webView.activity.startActivity(browserIntent); 
} 

的問題是,(從對話片段)打開外部活動,當你回到我的應用程序後(或者按後退按鈕或通過任務切換)應用程序崩潰:

AndroidRuntime了java.lang.RuntimeException:無法啓動活動ComponentInfo {com.myapp.Test/com.myapp.testActivity}:

android.app.Fragment $ InstantiationException:無法實例化片段com.myapp.Test.WebViewDialogFragment:確保cl屁股名稱存在,是公開的,有一個空的構造函數,它是公共

我通過添加一個空的構造函數來解決webviewdialogfragment崩潰,但是這不是我想要的。我想要一個保留其狀態的對話框片段。

你能幫我修改代碼來解決問題嗎?

請注意,父活動的onCreate不在我的控制之下,我不想修改它。

謝謝,我期待您的意見。讓我知道一個部分是否需要更好的解釋。

回答

1

碎片和活動需要一個空的構造函數,並且,如果提供,它必須是唯一的構造函數。如果要使用某些數據初始化片段,則必須在將片段添加到片段管理器之前創建片段並使用setArguments方法。看看這個question