Как правильно заменить фрагмент в пейджере вида? - PullRequest
2 голосов
/ 27 января 2012

У меня есть следующая структура моего приложения:

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, я хочу загрузить URL-адрес в WebView в том же месте, что и список. То есть я хочу заменить ListFragment (поместить его в задний стек) новым WebView.

До сих пор я пытался использовать FragmentTransaction.replace () из Activity. Такого рода работы, кроме двух выпусков:

  • ListFragment не отображает WebView до того, как я поверну устройство (т. Е. Воссоздается активность).
  • Содержимое другой вкладки исчезает (просто пусто)

Как правильно заменить ListFragment другим фрагментом?

Ответы [ 2 ]

1 голос
/ 28 января 2012

В качестве альтернативы, вы можете использовать пользовательский 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
0 голосов
/ 28 января 2012

В качестве обходного пути я сделал то, что AndroidTeam At Mail.Ru и знаток предложили в качестве ответов на Заменить фрагмент внутри ViewPager . Это, конечно, довольно плохой способ решения этой проблемы. Я чувствую себя немного грязно сейчас. : -S

...