Android简单有效Viewpager+Fragment实现滑动标签页

目录
一、简介
二、实战
三、总结

正文

一、简介
记录使用ViewPager+Fragment实现滑动标签页。这样的例子网上一堆,但是都写得比较啰嗦,我重新整理一下,简单、有效。一眼就能看到实例Demo,希望对你有帮助。

二、实战
1、xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
    >

    <LinearLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:gravity="center"
        android:orientation="horizontal"
        >

        <TextView
            android:id="@+id/tab1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="tab1"
            />

        <TextView
            android:id="@+id/tab2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="tab2"
            />

        <TextView
            android:id="@+id/tab3"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="tab3"/>
    </LinearLayout>

    <ImageView
        android:id="@+id/img"
        android:layout_width="80dp"
        android:layout_height="4dp"
        android:layout_below="@id/tabs"
        android:background="@color/green_me"
        />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/img"/>

</RelativeLayout>

2、activity代码:

package bluesky.example.com.mvpdemo;

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.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class ViewPagerTabDemoActivity extends FragmentActivity {
    private ImageView mImageView;//指示游标图片
    private int currIndex;//当前页
    private int offset;//移动偏移量
    private ViewPager mPager;
    private LinearLayout mTopMenuLayout;//顶部的tab页面布局

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_view_pager_tab_demo);
        initText();
        initImage();
        initPager();
    }

    private void initPager() {
        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(new myPagerAdapter(getSupportFragmentManager()));
        mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Animation animation = new TranslateAnimation(currIndex * offset, position * offset, 0, 0);//平移动画
                currIndex = position;
                animation.setFillAfter(true);//动画终止时停留在最后一帧,不然会回到没有执行前的状态
                animation.setDuration(200);//动画持续时间0.2秒
                mImageView.startAnimation(animation);//是用ImageView来显示动画的
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void initText() {
        TextView tab1 = (TextView) findViewById(R.id.tab1);
        TextView tab2 = (TextView) findViewById(R.id.tab2);
        TextView tab3 = (TextView) findViewById(R.id.tab3);

        tab1.setOnClickListener(new txListener(0));
        tab2.setOnClickListener(new txListener(1));
        tab3.setOnClickListener(new txListener(2));

    }

    public class txListener implements View.OnClickListener {
        private int index = 0;

        public txListener(int i) {
            index = i;
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mPager.setCurrentItem(index);
        }
    }

    private void initImage() {
        mImageView = (ImageView) findViewById(R.id.img);
        mTopMenuLayout = (LinearLayout) findViewById(R.id.tabs);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        //屏幕宽度
        int screenWidth = displayMetrics.widthPixels;
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(screenWidth / 3, 6);
        params.setMargins(0, mTopMenuLayout.getLayoutParams().height, 0, 0);
        mImageView.setLayoutParams(params);

        offset = (screenWidth / 3);//计算偏移量
    }

    class myPagerAdapter extends FragmentPagerAdapter {
        Fragment fragment1;

        public myPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    fragment1 = new Fragment1("tab1");
                    return fragment1;
                case 1:
                    fragment1 = new Fragment1("tab2");
                    return fragment1;
                case 2:
                    fragment1 = new Fragment1("tab3");
                    return fragment1;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {

            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "";
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_view_pager_tab_demo, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

3、Fragment代码:

package bluesky.example.com.mvpdemo;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by Bluesky on 2015/9/8.
 */
public class Fragment1 extends Fragment {

    private String mTitleStr;

    public Fragment1(String mTitleStr) {
        this.mTitleStr = mTitleStr;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        TextView textView = new TextView(getActivity());
        textView.setText(mTitleStr);
        textView.setGravity(Gravity.CENTER);
        return textView;
    }
}

三、总结
注意游标图片的宽度为三个Tab的平分屏幕的宽度。同理,游标图片移动的偏移量也是图片的宽度。设置游标图片的平移动画:

 Animation animation = new TranslateAnimation(currIndex * offset, position * offset, 0, 0);//平移动画
                currIndex = position;
                animation.setFillAfter(true);//动画终止时停留在最后一帧,不然会回到没有执行前的状态
                animation.setDuration(200);//动画持续时间0.2秒
                mImageView.startAnimation(animation);//是用ImageView来显示动画的

个人信息
- 微信:huangrx1988
- 博客:http://blog.csdn.net/hrx3627
- github:https://github.com/hrx3627
- Android交流QQ群 :367818514
- QQ:1084986314

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,`Fragment` 和 `ViewPager` 结合使用可以实现滑动切换的效果。通过在 `ViewPager` 中添加多个 `Fragment`,可以实现左右滑动切换不同的页面。需要注意的是,在使用 `ViewPager` 时,需要自定义一个 `PagerAdapter`,用于管理 `ViewPager` 中的 `Fragment`。同时,也可以通过 `TabLayout` 等其他的控件,为 `ViewPager` 添加标签,提高用户体验。 以下是 `ViewPager` 和 `Fragment` 结合使用的示例代码: 1. 在布局文件中添加 `ViewPager` 控件: ``` <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在 Activity 或 Fragment 中,为 `ViewPager` 设置 Adapter: ``` ViewPager viewPager = findViewById(R.id.view_pager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); ``` 3. 自定义一个 PagerAdapter,用于管理 ViewPager 中的 Fragment: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private static final int PAGE_COUNT = 3; public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new Fragment1(); case 1: return new Fragment2(); case 2: return new Fragment3(); default: return null; } } @Override public int getCount() { return PAGE_COUNT; } } ``` 在上述示例代码中,`MyPagerAdapter` 继承自 `FragmentPagerAdapter`,并重写了 `getItem()` 和 `getCount()` 方法,用于返回不同位置的 `Fragment` 对象。通过以上步骤,即可实现使用 `ViewPager` 和 `Fragment` 结合使用,实现滑动切换的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值