我在我的应用程序中使用ActionBarSherlock的操作栏选项卡,每个选项卡由SherlockActivity Tabs
内的单个片段填充。
我的一个标签包含一个片段FragmentHome
,其中包含新闻文章列表。选择文章后,FragmentHome
将被另一个片段FragmentNews
替换。
FragmentNews只包含一个用于加载所选文章的webview。这篇文章很好。我在我的活动中覆盖onBackPressed
,以便重新附加FragmentHome
并删除FragmentNews
。
虽然没有错误,但FragmentHome
内的webview永远不会从视图中删除,并与其他片段重叠。 (见截图)
它很奇怪,因为相同的代码适用于另一个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削减了一个漏洞,但我只是在没有任何视频的情况下显示简单的网页。非常感谢。
答案 0 :(得分:0)
我在查看WebViewFragment的源代码时发现了问题。我意识到除了webview的暂停/恢复之外没什么其他的。
我的代码中有两个严重的错误:
我从未在onCreatView
中返回夸大的视图
FragmentNews
。我正在返回super.onCreateView(inflater,
container, savedInstanceState).
我忘了在attachToRoot
时将false
设置为onCreateView
膨胀XML布局 - View view =
inflater.inflate(R.layout.fragment_news, container, **false**)
因此,膨胀的视图只是站在它自己而不附加到片段上。更换片段后,由于从未删除包含WebView
的膨胀布局,因此导致显示混乱。不幸的是,这没有错误。