如何正确替换视图寻呼机中的片段?

时间:2012-01-27 09:35:29

标签: android android-fragments android-viewpager actionbarsherlock

我的应用程序的结构如下:

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不会显示WebView(即重新创建活动)。
  • 其他标签的内容消失(只是空白)

将ListFragment替换为另一个片段的正确方法是什么?

2 个答案:

答案 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,并使用常规FragmentTransactionaddToBackStack()来获得您想要的内容。

注意:如果您想使用上面的代码,只需确保您的片段与整个屏幕的宽度相同,并记住您的结构应该类似

MyHorizontalScrollView > LinearLayout > YourFragment1
                                      > YourFragment2

答案 1 :(得分:0)

作为解决方法,我已经完成了 AndroidTeam At Mail.Ru 鉴定家建议的Replace Fragment inside a ViewPager上的答案。这当然是解决这个问题的一个非常糟糕的方法。我觉得现在有点脏。 :-S