1

我在我的应用程序中使用ActionBarSherlock的操作栏选项卡,每个选项卡由SherlockActivity Tabs中的单个片段填充。SherlockFragment中的WebView - FragmentTransaction.Detach()不会删除webview

我的一个标签包含一个片段FragmentHome,其中包含新闻报道列表。当选择一篇文章时,FragmentHome被替换为另一个片段FragmentNews

FragmentNews只包含一个webview加载选定的文章。文章加载正常。我重写我的活动中的onBackPressed,以便重新挂接FragmentHome,并删除FragmentNews

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

FragmentHome - OK FragmentNews - OK FragmentHome w/webview interference

它的怪异,因为相同的代码工作的另一个SherlockFragment在它ListView但使用WebView时弄乱了。下面是代码来替换FragmentHomeFragmentNews开始:

@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在标签:从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造成问题,因为

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

片段的SurfaceView切割一个洞,但我只是显示简单的网页没有任何视频。帮助高度赞赏。

回答

0

我在遍历WebViewFragment的源代码时发现了问题。我意识到除了webview的暂停/恢复之外没有太多的事情要做。

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

  1. 我从来没有在 FragmentNews返回充气视图onCreatView。我被返回super.onCreateView(inflater, container, savedInstanceState).

  2. 我忘记设置attachToRootfalseonCreateView当 膨胀所述XML布局 - View view = inflater.inflate(R.layout.fragment_news, container, **false**)

因此,膨胀的视图只是站在其自身不被附连到该片段。当片段被替换时,它会导致显示混乱,因为包含WebView的膨胀布局从未被删除。不幸的是,这符合没有错误。