2

カスタムの内部を持つレイアウトがあり、ViewPagerが垂直方向にスクロールしません。カスタムScrollViewは、ScrollViewでスワイプする恐ろしいタブを修正するために使用されます。ViewPagerScrollView

はい、スクロールするのに十分なコンテンツがあり、下のボタンがある場合とない場合で試しました。

私は3つのタブがあるActionBarを使用していますが、現在のコードでは左右にうまくスワイプできます。

私の目標は、保存やキャンセルなどのいくつかのアクションアイテムの下部バーを作成し、アクションバーと下部のボタンの間の部分を垂直方向にスクロールするViewPagerにすることです。

私はあまりにも多くの組み合わせを試しましたが、今このラブレターをあなたに送っています。何か案は?どんな助けでもありがたいです、そして必要ならば追加の詳細を遠慮なく尋ねてください。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/footer"
        style="@android:style/Holo.ButtonBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/saveButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Save" />

        <Button
            android:id="@+id/cancelButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Cancel" />
    </LinearLayout>

    <com.blah.hootiehoo.ViewPagerCompatScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/footer"
        android:fillViewport="true" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:scrollbarAlwaysDrawVerticalTrack="true"
            android:scrollbars="vertical" >

            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:scrollbars="vertical" >
            </android.support.v4.view.ViewPager>
        </LinearLayout>
    </com.blah.hootiehoo.ViewPagerCompatScrollView>

</RelativeLayout>

MainActivity.java

ViewPager mViewPager;
TabsAdapter mTabsAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    mViewPager = (ViewPager)findViewById(R.id.pager);

    // setup action bar for tabs
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);   

    mTabsAdapter = new TabsAdapter(this, mViewPager);

    Tab tab = actionBar.newTab();
    // tab setup
    mTabsAdapter.addTab(/*** stuff ***/);

    // add 2 more tabs, etc
}

ViewPagerCompatScrollView.java ここから取得しました。

public class ViewPagerCompatScrollView extends ScrollView {
    private float xDistance, yDistance, lastX, lastY;

    public ViewPagerCompatScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                lastX = ev.getX();
                lastY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                xDistance += Math.abs(curX - lastX);
                yDistance += Math.abs(curY - lastY);
                lastX = curX;
                lastY = curY;
                if(xDistance > yDistance)
                    return false;
        }

        return super.onInterceptTouchEvent(ev);
    }
}
4

3 に答える 3

8

以前のコメントによると:

ScrollViewViewPager周りを交換するオプションはありますか?ScrollView経験から、内部はViewPager問題なく動作することがわかります。したがって、基本的には、をラップする代わりに、ViewPagerすべてScrollViewの「ページ」ScrollViewをルートとして指定します。

それがあなたのために働いたと聞いてうれしいです。

于 2012-06-03T07:29:53.390 に答える
4

MH。答えはうまくいくはずです。

コードの問題は、ViewPagerがと同じheightScrollViewなるため、スクロールしないことです。内の各子ビューViewPagerも、と同じheightになりViewPagerます。

heightViewPager手動で設定してみてくださいeks android:layout_height="900dp"。うまくスクロールします...

しかし、あなたは本当にMHを使うべきです。の答え:)

于 2012-06-02T21:10:19.623 に答える
2

私はサミラーの問題を抱えていました。これが私がそれを解決した方法です。

imageGrid.setOnTouchListener(new View.OnTouchListener() {

        int dragthreshold = 30;
        int downX;
        int downY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = (int) event.getRawX();
                downY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int distanceX = Math.abs((int) event.getRawX() - downX);
                int distanceY = Math.abs((int) event.getRawY() - downY);

                if (distanceY > distanceX && distanceY > dragthreshold) {
                    imageGrid.getParent().requestDisallowInterceptTouchEvent(false);
                    parentScrollView.getParent().requestDisallowInterceptTouchEvent(true);
                } else if (distanceX > distanceY && distanceX > dragthreshold) {
                    imageGrid.getParent().requestDisallowInterceptTouchEvent(true);
                    parentScrollView.getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                parentScrollView.getParent().requestDisallowInterceptTouchEvent(false);
                imageGrid.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
            return false;
        }
    });

試すだけの価値があります。

于 2013-09-06T20:49:01.910 に答える