在选项卡布局上实现分页

时间:2011-10-12 07:09:03

标签: android pagination horizontalscrollview android-tabactivity

我知道如何使用xml布局开发标签活动,我也知道如何在Android中进行分页,如Android市场应用程序中所见

但我没有得到如何将此分页概念与tab活动合并以及如何从java代码创建tabactivity:

使用线性布局查看我用于分页的下面代码:

sample.java

public class Sample extends Activity {

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

        // creates the Pagination Layout
        PaginationLayout paginationLayout = new PaginationLayout(this);
        paginationLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        // creates content only for sample
        TableLayout table = new TableLayout(this);
        table.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        table.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);

        TableRow row = new TableRow(this);
        row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        table.addView(row);

        TableRow row2 = new TableRow(this);
        row2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        table.addView(row2);

        for(int i = 0; i< 50;i++){
            Button button = new Button(this);
            button.setText("Button " + i);
            if (i%2==0) {
                row.addView(button);
            } else {
                row2.addView(button);
            }
        }

        // add the content in pagination
        paginationLayout.addView(table);
        // set pagination layout
        setContentView(paginationLayout);
    }
}

,分页布局的代码为:

public class PaginationLayout extends LinearLayout {

    private int mPageActive = 0;
    private HorizontalScrollView mScroll;
    private LinearLayout mBar;

    public PaginationLayout(Context context) {
        super(context);

        setOrientation(LinearLayout.VERTICAL);

        // creates the class that will control the gestures and apply it in the
        // scroll
        final GestureDetector mGestureDetector = new GestureDetector(new MySimpleOnGestureListener());

        mScroll = new HorizontalScrollView(context);
        mScroll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        mScroll.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if (mGestureDetector.onTouchEvent(event)) {
                    return true;
                } else {
                    return false;
                }
            }
        });

        // creates Previous and Next buttons
        Button btnPrevious = new Button(getContext());
        btnPrevious.setLayoutParams(new LayoutParams(150, LayoutParams.FILL_PARENT));
        btnPrevious.setText("Previous");
        btnPrevious.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                previous();
            }
        });

        Button btnMid = new Button(getContext());
        btnMid.setLayoutParams(new LayoutParams(150, LayoutParams.FILL_PARENT));
        btnMid.setText("Mid");
        btnMid.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                next();
            }
        });

        Button btnNext = new Button(getContext());
        btnNext.setLayoutParams(new LayoutParams(150, LayoutParams.FILL_PARENT));
        btnNext.setText("Next");
        btnNext.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                next();
            }
        });

        // bar that include the buttons
        mBar = new LinearLayout(getContext());
        mBar.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        mBar.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
        mBar.setBackgroundColor(Color.GRAY);
        mBar.addView(btnPrevious);
        mBar.addView(btnNext);
        //mBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.android_1080p));
        mBar.setVisibility(LinearLayout.INVISIBLE);

        // add bar and scroll in the super (LinearLayout)
        super.addView(mBar);
        super.addView(mScroll);
    }

    /**
     * All that the user include is added in the scroll
     */
    @Override
    public void addView(View child) {
        mScroll.addView(child);
    }

    /**
     * Controls if the top bar should appear or not
     */
    @Override
    protected void onSizeChanged(int arg0, int arg1, int arg2, int arg3) {
        super.onSizeChanged(arg0, arg1, arg2, arg3);
        View chield = mScroll.getChildAt(0);
        if (chield != null) {
            if (chield.getMeasuredWidth() > getWidth()) {
                mBar.setVisibility(LinearLayout.VISIBLE);
            } else {
                mBar.setVisibility(LinearLayout.INVISIBLE);
            }
        }
    }

    /**
     * does the effect "back a page"
     */
    public void previous() {
        mPageActive = (mPageActive > 0) ? mPageActive - 1 : 0;
        mScroll.smoothScrollTo(mPageActive * mScroll.getWidth(), 0);
    }

    /**
     * does the effect "forward a page"
     */
    public void next() {
        int pageWidth = mScroll.getWidth();
        int nextPage = (mPageActive + 1) * pageWidth;
        if (nextPage - mScroll.getScrollX() <= pageWidth) {
            mScroll.smoothScrollTo(nextPage, 0);
            mPageActive++;
        } else {
            mScroll.smoothScrollTo(mScroll.getScrollX(), 0);
        }
    }

    /**
     * Private class that controls the gestures, forward or back a page.
     */
    private class MySimpleOnGestureListener extends SimpleOnGestureListener {

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            if (e1 != null && e2 != null) {
                if (e1.getX() - e2.getX() > 0) {
                    // forward...
                    next();
                    return true;
                } else if (e2.getX() - e1.getX() > 0) {
                    // back...
                    previous();
                    return true;
                }
            }

            return false;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我发现this它可能有用;)