我的应用程序的结构如下:
v4 FragmentActivity --> v4 ViewPager --> v4 Fragment
--> v4 ListFragment
我正在使用ActionBarSherlock(我真的推荐),而Activity的结构基于https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/demos/src/com/actionbarsherlock/sample/demos/app/ActionBarTabsPager.java的演示。因此,这两个片段显示为用户的两个选项卡。
当用户单击ListFragment的元素时,我想在WebView中加载与列表相同位置的URL。也就是说,我想用新的WebView替换ListFragment(把它放在后面的堆栈上)。
到目前为止,我已尝试使用“活动”中的FragmentTransaction.replace()。除了两个问题之外,还有那种作品:
将ListFragment替换为另一个片段的正确方法是什么?
答案 0 :(得分:1)
或者,您可以使用自定义HorizontalScrollView
代替ViewPager
并覆盖其onTouchEvent
方法,以获得与ViewPager相同的捕捉效果,如下所示:
public class MyHorizontalScrollView extends HorizontalScrollView {
public MyHorizontalScrollView(Context context) {
super(context);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
if (mScrollable) {
View child = getChildAt(0);
if (child != null) {
final int currentX = getScrollX();
final int windowWidth = getResources().getDisplayMetrics().widthPixels;
final int totalWidth = child.getWidth();
int showingElementNumber = 1;
int i = windowWidth;
while (i < currentX && i < totalWidth) {
i+=windowWidth;
showingElementNumber++;
}
int scrollTo = 0;
if (currentX < (windowWidth * (showingElementNumber - 1) + windowWidth/2)) { // Previouses widths + half the current
scrollTo = windowWidth * (showingElementNumber - 1);
} else {
scrollTo = windowWidth * showingElementNumber + marginSize;
}
smoothScrollTo(scrollTo, 0);
return false;
}
}
return super.onTouchEvent(ev);
default:
return super.onTouchEvent(ev);
}
}
}
然后,您可以在其中添加两个Fragments
,并使用常规FragmentTransaction
和addToBackStack()
来获得您想要的内容。
注意:如果您想使用上面的代码,只需确保您的片段与整个屏幕的宽度相同,并记住您的结构应该类似
MyHorizontalScrollView > LinearLayout > YourFragment1
> YourFragment2
答案 1 :(得分:0)
作为解决方法,我已经完成了 AndroidTeam At Mail.Ru 和鉴定家建议的Replace Fragment inside a ViewPager上的答案。这当然是解决这个问题的一个非常糟糕的方法。我觉得现在有点脏。 :-S