2

アプリの構造は次のとおりです。

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 . したがって、2 つのフラグメントは、ユーザーに対して 2 つのタブとして表示されます。

ユーザーが ListFragment の要素をクリックすると、リストと同じ場所にある WebView に URL をロードしたいと考えています。つまり、ListFragment (バックスタックに置く) を新しい WebView に置き換えたいと考えています。

これまでのところ、Activity からFragmentTransaction.replace()を使用してみました。2つの問題を除いて、その種の作品:

  • ListFragment は、デバイスを回転する前に WebView を表示しません (つまり、acitity が再作成されます)。
  • もう一方のタブの内容が消えます(ただの空白です)

ListFragment を別の Fragment に置き換える正しい方法は何ですか?

4

2 に答える 2

1

HorizontalScrollView別の方法として、 a の代わりにカスタムを使用し、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);
        }
    }
}

次に、その中に2つ追加Fragmentsし、通常のFragmentTransactionwithを使用して、addToBackStack()必要なものを取得できます。

注:上記のコードを使用する場合は、フラグメントが画面全体と同じ幅であることを確認してください。構造は次のようにする必要があります。

MyHorizontalScrollView > LinearLayout > YourFragment1
                                      > YourFragment2
于 2012-01-28T10:09:22.100 に答える
0

回避策として、AndroidTeam At Mail.Ruと目利きが、 ViewPager内のフラグメントの置換に関する回答として提案したことを実行しました。もちろん、これはこれを解決するためのかなり悪い方法です。今はちょっと汚い気がします。:-S

于 2012-01-27T20:52:52.230 に答える