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的膨脹佈局從未被刪除。不幸的是,這符合沒有錯誤。