ben*_*lis 13 android android-webview android-fragments android-3.0-honeycomb android-4.0-ice-cream-sandwich
我目前的应用程序设置ListFragment
在左侧和DetailsFragment
右侧(类似于下面平板电脑上的布局).
在细节片段(列表旁边的片段)上我有一个转到交易按钮,按下时应该用一个替换detailsFragment WebViewFragment
.
我遇到的问题是,当尝试在webviewfragment中加载URL时,该WebView
值为null.
WebViewFragment webViewFragment = new WebViewFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.deal_details_fragment, webViewFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
// Set the url
if (webViewFragment.getWebView()==null)
Log.d("webviewfragment", "is null");
webViewFragment.getWebView().loadUrl("http://www.google.com");
Run Code Online (Sandbox Code Playgroud)
下面是我的主要布局,其中定义了原始的两个片段.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_activity_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<fragment
android:name="com.bencallis.dealpad.DealListFragment"
android:id="@+id/deal_list_fragment"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" >
<!-- Preview: layout=@layout/deal_list_fragment -->
</fragment>
<fragment
android:name="com.bencallis.dealpad.DealDetailsFragment"
android:id="@+id/deal_details_fragment"
android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent" >
<!-- Preview: layout=@layout/deal_details_fragment -->
</fragment>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
似乎没有完全创建webViewFragment,因为WebView
尚未初始化.我在网上看了一下,但关于这方面的信息很少WebViewFragment
.
任何想法如何确保WebView
在初始化WebViewFragment
?
ben*_*lis 12
在Espiandev的帮助下,我成功地获得了一个有效的WebView.为了确保在片段中而不是在Web浏览器应用程序中打开链接,我创建了一个扩展WebViewClinet的简单InnerWebView客户端.
public class DealWebViewFragment extends Fragment {
private WebView mWebView;
private boolean mIsWebViewAvailable;
private String mUrl = null;
/**
* Creates a new fragment which loads the supplied url as soon as it can
* @param url the url to load once initialised
*/
public DealWebViewFragment(String url) {
super();
mUrl = url;
}
/**
* Called to instantiate the view. Creates and returns the WebView.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mWebView != null) {
mWebView.destroy();
}
mWebView = new WebView(getActivity());
mWebView.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return false;
}
});
mWebView.setWebViewClient(new InnerWebViewClient()); // forces it to open in app
mWebView.loadUrl(mUrl);
mIsWebViewAvailable = true;
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
return mWebView;
}
/**
* Convenience method for loading a url. Will fail if {@link View} is not initialised (but won't throw an {@link Exception})
* @param url
*/
public void loadUrl(String url) {
if (mIsWebViewAvailable) getWebView().loadUrl(mUrl = url);
else Log.w("ImprovedWebViewFragment", "WebView cannot be found. Check the view and fragment have been loaded.");
}
/**
* Called when the fragment is visible to the user and actively running. Resumes the WebView.
*/
@Override
public void onPause() {
super.onPause();
mWebView.onPause();
}
/**
* Called when the fragment is no longer resumed. Pauses the WebView.
*/
@Override
public void onResume() {
mWebView.onResume();
super.onResume();
}
/**
* Called when the WebView has been detached from the fragment.
* The WebView is no longer available after this time.
*/
@Override
public void onDestroyView() {
mIsWebViewAvailable = false;
super.onDestroyView();
}
/**
* Called when the fragment is no longer in use. Destroys the internal state of the WebView.
*/
@Override
public void onDestroy() {
if (mWebView != null) {
mWebView.destroy();
mWebView = null;
}
super.onDestroy();
}
/**
* Gets the WebView.
*/
public WebView getWebView() {
return mIsWebViewAvailable ? mWebView : null;
}
/* To ensure links open within the application */
private class InnerWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
希望这对将来的某个人有用.
编辑:所以我玩了一段时间,似乎WVF有点垃圾,旨在被覆盖.但是,根本没有关于此的文档!问题源于你可以在Fragment
加载视图之前调用getWebView()的事实,因此你的NullPointerException
.除非没有任何方法可以检测Fragment的视图何时被加载,所以你有点卡住了!
相反,我覆盖了类,添加位和更改位,所以现在它将正常工作.检查此链接以获取代码.然后而不是使用:
WebViewFragment webViewFragment = new WebViewFragment();
Run Code Online (Sandbox Code Playgroud)
加载你的片段,使用:
ImprovedWebViewFragment wvf = new ImprovedWebViewFragment("www.google.com");
Run Code Online (Sandbox Code Playgroud)
这个类还包括一个加载url的便捷方法,如果没有则不会抛出.Exception
WebView
所以,不,我不认为使用内置的WebViewFragment有一个特别简单的方法,但很容易做出有效的东西.希望能帮助到你!
归档时间: |
|
查看次数: |
15752 次 |
最近记录: |