Android SherlockFragment内的WebView-FragmentTransaction.Detach()不会删除WebView
我在应用程序中使用ActionBarSherlock的操作栏选项卡,每个选项卡由SherlockActivityAndroid SherlockFragment内的WebView-FragmentTransaction.Detach()不会删除WebView,android,webview,actionbarsherlock,fragment,fragmenttransaction,Android,Webview,Actionbarsherlock,Fragment,Fragmenttransaction,我在应用程序中使用ActionBarSherlock的操作栏选项卡,每个选项卡由SherlockActivity选项卡中的单个片段填充 我的一个选项卡包含一个片段,FragmentHome,其中包含一个新闻文章列表。当一篇文章被选中时,FragmentHome将被另一篇片段取代,FragmentNews FragmentNews仅包含用于加载所选文章的webview。这件物品装载得很好。我在我的活动中覆盖了onBackPressed,以便重新连接FragmentHome,并删除FragmentN
选项卡中的单个片段填充
我的一个选项卡包含一个片段,FragmentHome
,其中包含一个新闻文章列表。当一篇文章被选中时,FragmentHome
将被另一篇片段取代,FragmentNews
FragmentNews仅包含用于加载所选文章的webview。这件物品装载得很好。我在我的活动中覆盖了onBackPressed
,以便重新连接FragmentHome
,并删除FragmentNews
虽然没有错误,但是FragmentHome
中的webview永远不会从视图中删除,并且与其他片段重叠。(见截图)
这很奇怪,因为同一个代码适用于另一个SherlockFragment
,其中包含ListView
,但在使用WebView
时会出错。以下是最初用FragmentNews
替换FragmentHome
的代码:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
listNews.setItemChecked(position, true);
Bundle bundle = new Bundle();
bundle.putStringArray("NEWS",
new String[] {
mNews.newsFeed.get(position).getTitle(),
mNews.newsFeed.get(position).getLink()
.toExternalForm() });
FragmentTransaction ft = getSherlockActivity()
.getSupportFragmentManager().beginTransaction();
Fragment frag = SherlockFragment.instantiate(getSherlockActivity(),
FragmentNews.class.getName(), bundle);
ft.detach(getSherlockActivity().getSupportFragmentManager()
.findFragmentById(getId()));
ft.add(android.R.id.content, frag, Tabs.FRAG_NEWS);
ft.commit();
}
片段新闻
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
arr = getArguments().getStringArray("NEWS");
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, container);
newsView = (WebView) view.findViewById(R.id.news_WV_Brief);
newsView.getSettings()
.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
newsView.getSettings().setGeolocationEnabled(false);
newsView.getSettings().setAllowFileAccess(false);
newsView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("override", url);
return true;
}
});
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
newsView.loadUrl(arr[1]);
}
我曾看到一些帖子谈论FlashPlayer会因为SurfaceView的漏洞而引发问题,但我只是显示简单的网页,没有任何视频。非常感谢您的帮助。我在查看WebViewFragment的源代码时发现了这个问题。我意识到除了webview的暂停/恢复之外,没有什么别的事情发生
我的代码中有两个严重错误:
我从未在中的onCreatView
中返回膨胀视图
FragmentNews
。我正在返回super.onCreateView(充气机,
容器,savedInstanceState)。
我忘记在创建视图时将onCreateView中的attachToRoot
设置为false
膨胀XML布局-视图=
充气机。充气(R.layout.fragment\u新闻,容器,**假**)
因此,膨胀的视图只是独立存在,而没有连接到碎片上。当片段被替换时,由于包含WebView
的膨胀布局从未被移除,因此导致了一个混乱的显示。不幸的是,这没有错误
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
arr = getArguments().getStringArray("NEWS");
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, container);
newsView = (WebView) view.findViewById(R.id.news_WV_Brief);
newsView.getSettings()
.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
newsView.getSettings().setGeolocationEnabled(false);
newsView.getSettings().setAllowFileAccess(false);
newsView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("override", url);
return true;
}
});
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
newsView.loadUrl(arr[1]);
}