SherlockFragment中的WebView - FragmentTransaction.Detach()不会删除webview

时间:2013-04-27 13:38:19

标签: android webview actionbarsherlock fragment fragmenttransaction

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

我的一个标签包含一个片段FragmentHome,其中包含新闻文章列表。选择文章后,FragmentHome将被另一个片段FragmentNews替换。

FragmentNews只包含一个用于加载所选文章的webview。这篇文章很好。我在我的活动中覆盖onBackPressed,以便重新附加FragmentHome并删除FragmentNews

虽然没有错误,但FragmentHome内的webview永远不会从视图中删除,并与其他片段重叠。 (见截图)

FragmentHome - OK FragmentNews - OK FragmentHome w/webview interference

它很奇怪,因为相同的代码适用于另一个SherlockFragment,其中包含ListView,但在使用WebView时却搞砸了。以下是最初用FragmentHome替换FragmentNews的代码:

@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();
}

在标签中覆盖onBackPressed:

@Override
public void onBackPressed() {
    Fragment frag = getSupportFragmentManager().findFragmentByTag(
            FRAG_DETAILS);

    if (frag != null && frag.isVisible()) {
        FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.remove(frag);

        Fragment mFragment = getSupportFragmentManager().findFragmentByTag(
                TAB_PORTFOLIO);
        if (mFragment == null) {
            mFragment = SherlockFragment.instantiate(this,
                    FragmentPortfolioList.class.getName(), null);
            ft.add(android.R.id.content, mFragment, TAB_PORTFOLIO);
        } else {
            ft.attach(mFragment);

        }
        ft.commit();
    } else {

        frag = getSupportFragmentManager().findFragmentByTag(FRAG_NEWS);
        if (frag != null && !frag.isDetached()) {
            Log.e("onBackPressed", "for " + frag.getTag());
            FragmentTransaction ft = getSupportFragmentManager()
                    .beginTransaction();
            ft.remove(frag);

            Fragment mFragment = getSupportFragmentManager()
                    .findFragmentByTag(TAB_HOME);
            if (mFragment == null) {
                mFragment = SherlockFragment.instantiate(this,
                        FragmentHome.class.getName(), null);
                ft.add(android.R.id.content, mFragment, TAB_HOME);
            } else {
                ft.attach(mFragment);
            }
            ft.commit();
        } else {
            Log.e("onBackPressed", "inside else");
            super.onBackPressed();
        }
    }
}
来自FragmentNews的

片段

@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削减了一个漏洞,但我只是在没有任何视频的情况下显示简单的网页。非常感谢。

1 个答案:

答案 0 :(得分:0)

我在查看WebViewFragment的源代码时发现了问题。我意识到除了webview的暂停/恢复之外没什么其他的。

我的代码中有两个严重的错误:

  1. 我从未在onCreatView中返回夸大的视图 FragmentNews。我正在返回super.onCreateView(inflater, container, savedInstanceState).

  2. 我忘了在attachToRoot时将false设置为onCreateView 膨胀XML布局 - View view = inflater.inflate(R.layout.fragment_news, container, **false**)

  3. 因此,膨胀的视图只是站在它自己而不附加到片段上。更换片段后,由于从未删除包含WebView的膨胀布局,因此导致显示混乱。不幸的是,这没有错误。