5

http://www.zylinc.com/blog-reader/items/viewpager-page-indicator.htmlからviewpagerindicatorのこのコードを参照しました。さまざまなページにさまざまなビューを表示したいのですが、現在、すべてのページ(3ページ)ですが、2ページ目と3ページ目にテキストビューを表示したいと思います。いくつかの変更を加え、配列を使用してタイトルを作成しました。これがそのスニペットです。

            @Override
        public String getTitle(int pos){
            Log.i("FragmentList", "current page position is : " +mViewPager.getCurrentItem());
            switch (pos) {
            case 0:return titles[0];
            case 1:return titles[1];
            case 2:return titles[2];
            default:return titles[0];

            }
//          pageListener = new DetailOnPageChange();
//          mViewPager.setOnPageChangeListener(pageListener);
        }

したがって、ページを変更するときに、レイアウトも変更したいのですが、ページの現在の位置を取得できれば、それらをスイッチケースに入れてレイアウトを実装できます...しかし、mViewpager.getcurrentitemがこの関数で適切に動作するため、無駄になります。 some1は、これを実装する必要がある人を助けてくれます。これが私のコードviewpagerindicatorアクティビティです。

package com.zylinc.view;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.zip.Inflater;

import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ViewPagerIndicatorActivity extends FragmentActivity 
{
    DetailOnPageChange pageListener;
    PagerAdapter mPagerAdapter;
    static ViewPager  mViewPager;
    ViewPagerIndicator mIndicator;
    static TextView stv;
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    static SimpleDateFormat readableDateFormat = new SimpleDateFormat("yyyy - MM/dd");
    public int numberofPages = 3;
    Inflater inflater;
    public static final String[] titles = new String[]{"First Page","Second Page","Third Page"};
    public static int pos;
    public int currentPageIs;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create our custom adapter to supply pages to the viewpager.
        mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager)findViewById(R.id.pager);
        mViewPager.setAdapter(mPagerAdapter);

        // Start at a custom position
        mViewPager.setCurrentItem(0);

        // Find the indicator from the layout
        mIndicator = (ViewPagerIndicator)findViewById(R.id.indicator);

        // Set the indicator as the pageChangeListener
        mViewPager.setOnPageChangeListener(mIndicator);

        // Initialize the indicator. We need some information here:
        // * What page do we start on.
        // * How many pages are there in total
        // * A callback to get page titles
        Log.i("number of counts are ", "pages are"+mPagerAdapter.getCount());
        mIndicator.init(0, mPagerAdapter.getCount(), mPagerAdapter);
        Resources res = getResources();
        Drawable prev = res.getDrawable(R.drawable.indicator_prev_arrow);
        Drawable next = res.getDrawable(R.drawable.indicator_next_arrow);
        mIndicator.setFocusedTextColor(new int[]{255, 0, 0});

        // Set images for previous and next arrows.
        mIndicator.setArrows(prev, next);

        mIndicator.setOnClickListener(new OnIndicatorClickListener());
    }

    class OnIndicatorClickListener implements ViewPagerIndicator.OnClickListener{
        @Override
        public void onCurrentClicked(View v) {
            Toast.makeText(ViewPagerIndicatorActivity.this, "Hello", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNextClicked(View v) {
            mViewPager.setCurrentItem(Math.min(mPagerAdapter.getCount() - 1, mIndicator.getCurrentPosition() + 1));
        }

        @Override
        public void onPreviousClicked(View v) {
            mViewPager.setCurrentItem(Math.max(0, mIndicator.getCurrentPosition() - 1));
        }

    }

    class PagerAdapter extends FragmentPagerAdapter implements ViewPagerIndicator.PageInfoProvider
    {
        ArrayList<Fragment> fragments = new ArrayList<Fragment>();
        //ArrayList<String> showTitles = new ArrayList<String>();
        //String myPos = titles[pos];
        public PagerAdapter(FragmentManager fm) {
            super(fm);


        }

        @Override
        public Fragment getItem(int pos) {


            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DAY_OF_MONTH, pos - getCount() / 2);
            return ItemFragment.newInstance(cal.getTime());
            //return ItemFragment.newInstance(titles[pos]);

        }


        @Override
        public String getTitle(int pos){
            Log.i("FragmentList", "current page position is : " +mViewPager.getCurrentItem());
            switch (pos) {
            case 0:return titles[0];
            case 1:return titles[1];
            case 2:return titles[2];
            default:return titles[0];

            }
//          pageListener = new DetailOnPageChange();
//          mViewPager.setOnPageChangeListener(pageListener);
        }

        @Override
        public int getCount() {
            return numberofPages;
        }

    }
    public class DetailOnPageChange extends ViewPager.SimpleOnPageChangeListener{

        @Override
        public void onPageSelected(int position) {
            Log.i("FragmentList", "************* position is : " +currentPageIs);
            currentPageIs = position;
        }
        public int getCurrentPage(){
            return currentPageIs;
        }
    }


    public static class ItemFragment extends ListFragment
    {
        static Date date;
        TextView tv;

        static ItemFragment newInstance(Date date) {

            ItemFragment f = new ItemFragment();
            // Supply num input as an argument.
            Bundle args = new Bundle();

            args.putString("date", sdf.format(date));
            f.setArguments(args);

            return f;
        }

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


            try {
                this.date = sdf.parse(getArguments().getString("date"));
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            //Log.i("FragmentList", "current page checker position is : " +titles[pos]);

            View v = inflater.inflate(R.layout.date_fragment, container, false);
            View tv = v.findViewById(R.id.text);
            ((TextView)tv).setText(readableDateFormat.format(date));
            return v;
        }

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

            setListAdapter(new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, list));
        }

        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            Log.i("FragmentList", "Item clicked: " + id);
        }
    }

    public static final String[] list = new String[]{"France", "London", "Sweden", "Denmark", "Germany", "Finland", "Thailand", "Taiwan", "USA", "Norway", "Lithuania", "Bosnia", "Russia", "Vietnam", "Australia"};
}

これがアダプターです

package com.zylinc.view;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * An small bar indicating the title of the previous,
 * current and next page to be shown in a ViewPager.
 * Made to resemble the indicator in the Google+ application
 * in function.
 * 
 * @author Mark Gjøl @ Zylinc
 */
public class ViewPagerIndicator extends RelativeLayout implements OnPageChangeListener {
    private static final int PADDING = 5;

    TextView mPrevious;
    TextView mCurrent;
    TextView mNext;
    int mCurItem;
    int mRestoreCurItem = -1;

    LinearLayout mPreviousGroup;
    LinearLayout mNextGroup;

    int mArrowPadding;
    int mSize;

    ImageView mCurrentIndicator;
    ImageView mPrevArrow;
    ImageView mNextArrow;

    int[] mFocusedTextColor;
    int[] mUnfocusedTextColor;

    OnClickListener mOnClickHandler;

    public interface PageInfoProvider{
        String getTitle(int pos);
    }

    public interface OnClickListener{
        void onNextClicked(View v);
        void onPreviousClicked(View v);
        void onCurrentClicked(View v);
    }

    public void setOnClickListener(OnClickListener handler){
        this.mOnClickHandler = handler;
        mPreviousGroup.setOnClickListener(new OnPreviousClickedListener());
        mCurrent.setOnClickListener(new OnCurrentClickedListener());
        mNextGroup.setOnClickListener(new OnNextClickedListener());
    }

    public int getCurrentPosition(){
        return mCurItem;
    }

    PageInfoProvider mPageInfoProvider;
    public void setPageInfoProvider(PageInfoProvider pageInfoProvider){
        this.mPageInfoProvider = pageInfoProvider;
    }

    public void setFocusedTextColor(int[] col){
        System.arraycopy(col, 0, mFocusedTextColor, 0, 3);
        updateColor(0);
    }

    public void setUnfocusedTextColor(int[] col){
        System.arraycopy(col, 0, mUnfocusedTextColor, 0, 3);
        mNext.setTextColor(Color.argb(255, col[0], col[1], col[2]));
        mPrevious.setTextColor(Color.argb(255, col[0], col[1], col[2]));
        updateColor(0);
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        Parcelable state = super.onSaveInstanceState();
        Bundle b = new Bundle();
        b.putInt("current", this.mCurItem);
        b.putParcelable("viewstate", state);
        return b;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        super.onRestoreInstanceState(((Bundle)state).getParcelable("viewstate"));
        mCurItem = ((Bundle)state).getInt("current", mCurItem);
        this.setText(mCurItem - 1);
        this.updateArrows(mCurItem);
        this.invalidate();
    }

    /**
     * Initialization
     * 
     * @param startPos The initially selected element in the ViewPager
     * @param size Total amount of elements in the ViewPager
     * @param pageInfoProvider Interface that returns page titles
     */
    public void init(int startPos, int size, PageInfoProvider pageInfoProvider){
        setPageInfoProvider(pageInfoProvider);
        this.mSize = size;
        setText(startPos - 1);
        mCurItem = startPos;
    }

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

    public ViewPagerIndicator(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
        addContent();
    }

    public ViewPagerIndicator(Context context) {
        super(context);
        addContent();
    }

    /**
     * Add drawables for arrows
     * 
     * @param prev Left pointing arrow
     * @param next Right pointing arrow
     */
    public void setArrows(Drawable prev, Drawable next){
        this.mPrevArrow = new ImageView(getContext());
        this.mPrevArrow.setImageDrawable(prev);

        this.mNextArrow = new ImageView(getContext());
        this.mNextArrow.setImageDrawable(next);

        LinearLayout.LayoutParams arrowLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        arrowLayoutParams.gravity = Gravity.CENTER;

        mPreviousGroup.removeAllViews();
        mPreviousGroup.addView(mPrevArrow, arrowLayoutParams);
        mPreviousGroup.addView(mPrevious, arrowLayoutParams);

        mPrevious.setPadding(PADDING, 0, 0, 0);
        mNext.setPadding(0, 0, PADDING, 0);

        mArrowPadding = PADDING + prev.getIntrinsicWidth();

        mNextGroup.addView(mNextArrow, arrowLayoutParams);
        updateArrows(mCurItem);
    }

    /**
     * Create all views, build the layout
     */
    private void addContent(){
        mFocusedTextColor = new int[]{0, 0, 0};
        mUnfocusedTextColor = new int[]{190, 190, 190};

        // Text views
        mPrevious = new TextView(getContext());
        mCurrent = new TextView(getContext());
        mNext = new TextView(getContext());

        RelativeLayout.LayoutParams previousParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        previousParams.addRule(RelativeLayout.ALIGN_LEFT);

        RelativeLayout.LayoutParams currentParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        currentParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

        RelativeLayout.LayoutParams nextParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        nextParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

        // Groups holding text and arrows
        mPreviousGroup = new LinearLayout(getContext());
        mPreviousGroup.setOrientation(LinearLayout.HORIZONTAL);
        mNextGroup = new LinearLayout(getContext());
        mNextGroup.setOrientation(LinearLayout.HORIZONTAL);

        mPreviousGroup.addView(mPrevious, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        mNextGroup.addView(mNext, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        addView(mPreviousGroup, previousParams);
        addView(mCurrent, currentParams);
        addView(mNextGroup, nextParams);

        mPrevious.setSingleLine();
        mCurrent.setSingleLine();
        mNext.setSingleLine();

        mPrevious.setText("previous");
        mCurrent.setText("current");
        mNext.setText("next");

        mPrevious.setClickable(false);
        mNext.setClickable(false);
        mCurrent.setClickable(true);
        mPreviousGroup.setClickable(true);
        mNextGroup.setClickable(true);

        // Set colors
        mNext.setTextColor(Color.argb(255, mUnfocusedTextColor[0], mUnfocusedTextColor[1], mUnfocusedTextColor[2]));
        mPrevious.setTextColor(Color.argb(255, mUnfocusedTextColor[0], mUnfocusedTextColor[1], mUnfocusedTextColor[2]));
        updateColor(0);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        positionOffsetPixels = adjustOffset(positionOffsetPixels);
        position = updatePosition(position, positionOffsetPixels);
        setText(position - 1);
        updateColor(positionOffsetPixels);
        updateArrows(position);
        updatePositions(positionOffsetPixels);
        mCurItem = position;
    }

    void updatePositions(int positionOffsetPixels){
        int textWidth = mCurrent.getWidth() - mCurrent.getPaddingLeft() - mCurrent.getPaddingRight();
        int maxOffset = this.getWidth() / 2 - textWidth / 2 - mArrowPadding;
        if(positionOffsetPixels > 0){
            maxOffset -= this.getPaddingLeft();
            int offset = Math.min(positionOffsetPixels, maxOffset - 1);
            mCurrent.setPadding(0, 0, 2 * offset, 0);

            // Move previous text out of the way. Slightly buggy.
            /*
            int overlapLeft = mPreviousGroup.getRight() - mCurrent.getLeft() + mArrowPadding;
            mPreviousGroup.setPadding(0, 0, Math.max(0, overlapLeft), 0);
            mNextGroup.setPadding(0, 0, 0, 0);
            */
        }else{
            maxOffset -= this.getPaddingRight();
            int offset = Math.max(positionOffsetPixels, -maxOffset);
            mCurrent.setPadding(-2 * offset, 0, 0, 0);

            // Move next text out of the way. Slightly buggy.
            /*
            int overlapRight = mCurrent.getRight() - mNextGroup.getLeft() + mArrowPadding;
            mNextGroup.setPadding(Math.max(0, overlapRight), 0, 0, 0);
            mPreviousGroup.setPadding(0, 0, 0, 0);
            */
        }
    }

    /**
     * Hide arrows if we can't scroll further
     * 
     * @param position
     */
    void updateArrows(int position){
        if(mPrevArrow != null){
            mPrevArrow.setVisibility(position == 0 ? View.INVISIBLE : View.VISIBLE);
            mNextArrow.setVisibility(position == mSize - 1 ? View.INVISIBLE : View.VISIBLE);
        }
    }

    /**
     * Adjust position to be the view that is showing the most.
     * 
     * @param givenPosition
     * @param offset
     * @return
     */
    int updatePosition(int givenPosition, int offset){
        int pos;
        if(offset < 0){
            pos = givenPosition + 1;
        }else{
            pos = givenPosition;
        }
        return pos; 
    }

    /**
     * Fade "currently showing" color depending on it's position
     * 
     * @param offset
     */
    void updateColor(int offset){
        offset = Math.abs(offset);
        // Initial condition: offset is always 0, this.getWidth is also 0! 0/0 = NaN
        int width = this.getWidth();
        float fraction = width == 0 ? 0 : offset / ((float)width / 4.0f);
        fraction = Math.min(1, fraction);
        int r = (int)(mUnfocusedTextColor[0] * fraction + mFocusedTextColor[0] * (1 - fraction));
        int g = (int)(mUnfocusedTextColor[1] * fraction + mFocusedTextColor[1] * (1 - fraction));
        int b = (int)(mUnfocusedTextColor[2] * fraction + mFocusedTextColor[2] * (1 - fraction));
        mCurrent.setTextColor(Color.argb(255, r, g, b));
    }

    /**
     * Update text depending on it's position
     * 
     * @param prevPos
     */
    void setText(int prevPos){
        if(prevPos < 0){
            mPrevious.setText("");
        }else{
            mPrevious.setText(mPageInfoProvider.getTitle(prevPos));
        }
        mCurrent.setText(mPageInfoProvider.getTitle(prevPos + 1));
        if(prevPos + 2 == this.mSize){
            mNext.setText("");
        }else{
            mNext.setText(mPageInfoProvider.getTitle(prevPos + 2));
        }
    }

    // Original:
    // 244, 245, 0, 1, 2
    // New:
    // -2, -1, 0, 1, 2
    int adjustOffset(int positionOffsetPixels){
        // Move offset half width
        positionOffsetPixels += this.getWidth() / 2;
        // Clamp to width
        positionOffsetPixels %= this.getWidth();
        // Center around zero
        positionOffsetPixels -= this.getWidth() / 2;
        return positionOffsetPixels;
    }

    @Override
    public void onPageSelected(int position) {
        // Reset padding when the page is finally selected (May not be necessary)
        mCurrent.setPadding(0, 0, 0, 0);
    }

    class OnPreviousClickedListener implements android.view.View.OnClickListener{
        @Override
        public void onClick(View v) {
            if(mOnClickHandler != null){
                mOnClickHandler.onPreviousClicked(ViewPagerIndicator.this);
            }
        }
    }
    class OnCurrentClickedListener implements android.view.View.OnClickListener{
        @Override
        public void onClick(View v) {
            if(mOnClickHandler != null){
                mOnClickHandler.onCurrentClicked(ViewPagerIndicator.this);
            }
        }
    }
    class OnNextClickedListener implements android.view.View.OnClickListener{
        @Override
        public void onClick(View v) {
            if(mOnClickHandler != null){
                mOnClickHandler.onNextClicked(ViewPagerIndicator.this);
            }
        }
    }
}
4

1 に答える 1

2

このブログが役立つかもしれません。ActionBarSherlockとViewPagerIndicatorをうまく機能させる

ここで言及されているバグに遭遇することもあります。Android-IllegalArgumentExceptionを与えるGoogleMapsAPI2.0を使用したSupportMapFragment

幸運を..!!

于 2013-02-19T09:39:46.757 に答える