Android SherlockFragment内的WebView-FragmentTransaction.Detach()不会删除WebView

Android 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

我在应用程序中使用ActionBarSherlock的操作栏选项卡,每个选项卡由SherlockActivity
选项卡中的单个片段填充

我的一个选项卡包含一个片段,
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]);
    
        }