仿网易新闻的ViewpagerIndicator

本文详细介绍了如何使用ActionBarSherlock和ViewPager实现Android应用中的TabView页面切换功能,包括布局设计、代码实现及遇到的问题解决。通过实践,熟悉了ActionBarSherlock的用法,并成功实现了页面间的数据交互。

以前写过类似的效果,但是是使用viewpagerindicator的开源框架来完成的.

今天刚巧看了一篇博客(http://blog.youkuaiyun.com/xiaanming/article/details/9971721),打算实现一下,顺便也熟悉一下ActionBarSherlock的用法.

使用ViewPagerIndicator的方式可以参考:http://blog.youkuaiyun.com/xiaanming/article/details/10766053

ActionBarSherlock

ActionBar是3.0以后才有的,如果要向下兼容,就要用到ActionBarSherlock的jar包了.下载地址https://github.com/JakeWharton/ActionBarSherlock

ActionBarSherlock的导入和一般lib一样,但是需要注意:V7包的V4包会和ActionBarSherlock的V4包冲突,可以不用V7包.

还有就是所有的style中的theme都要改成Theme.Sherlock前缀的.如下



遇到的问题:MainActivity报错 ======The hierarchy of the type is inconsistent========

原因:在eclipse里建了两个项目,分别是A projiect和B projiect,项目A引用了一些JAR包,然后项目B引用了项目A,但是B没有引用A的JAR包

解决:原来是当前项目的lib中V4包没有build....


开始动工

1.activity布局

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.mio.tabviewpage.MainActivity" >

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

</RelativeLayout>




2.activity代码

/**
 * 需要实现两个监听
 * TabListener:				tab改变--->Viewpage改变
 * OnPageChangeListener:	ViewPage改变--->tab改变
 * @author mio
 *
 */
public class MainActivity extends SherlockFragmentActivity implements
		ActionBar.TabListener,OnPageChangeListener {

	private String[] mTabTitles = { "首页", "新闻", "关注", "声音" };
	private ViewPager mViewPager;
	/**
	 * 装载Fragment的容器,我们的每一个界面都是一个Fragment
	 */
	private List<Fragment> mFragmentList;
	private ActionBar mActionBar;

	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_main);
		init();
	}

	private void init() {
		mViewPager = (ViewPager) findViewById(R.id.vp);
		mFragmentList =  new ArrayList<Fragment>(); 
		mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(),
				mFragmentList));

		// 获取ActionBar实例我们使用getSupportActionBar()方法
		mActionBar = getSupportActionBar();
		// 隐藏Title
		mActionBar.setDisplayShowTitleEnabled(false);
		// 隐藏Home logo
		mActionBar.setDisplayShowHomeEnabled(false);
		// 设置ActionBar的导航模式为Tab
		mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		// 设置监听
		mViewPager.setOnPageChangeListener(this);

		// 为ActionBar添加Tab并设置TabListener
		// 为ActionBar添加Tab并设置TabListener
		for (int i = 0; i < mTabTitles.length; i++) {
			ActionBar.Tab tab = mActionBar.newTab();
			tab.setText(mTabTitles[i]);
			tab.setTabListener(this);
			mActionBar.addTab(tab, i);
		}

		// 将Fragment加入到List中,并将Tab的title传递给Fragment
		for (int i = 0; i < mTabTitles.length; i++) {
			Fragment fragment = new ItemFragment();
			// 将tab的名称传递给Fragment
			Bundle args = new Bundle();
			args.putString("arg", mTabTitles[i]);
			fragment.setArguments(args);

			mFragmentList.add(fragment);
		}

	}

	/**
	 * 点击ActionBar Tab的时候切换不同的Fragment界面
	 */
	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		mViewPager.setCurrentItem(tab.getPosition());
	}

	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {

	}

	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {

	}

	@Override
	public void onPageScrollStateChanged(int arg0) {

	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {

	}

	@Override
	public void onPageSelected(int arg0) {
		// 滑动ViewPager的时候设置相对应的ActionBar Tab被选中
		mActionBar.setSelectedNavigationItem(arg0);

	}
}

3.Frangment代码

  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
          
        View contextView = inflater.inflate(R.layout.fragment_item, container, false);  
        TextView mTextView = (TextView) contextView.findViewById(R.id.textview);  
          
        //获取Activity传递过来的参数  
        Bundle mBundle = getArguments();  
        String title = mBundle.getString("arg");  
          
        mTextView.setText(title);  
          
        return contextView;  
    }  
  
    @Override  
    public void onActivityCreated(Bundle savedInstanceState) {  
        super.onActivityCreated(savedInstanceState);  
    }  
  


4.adapter代码

public class TabPagerAdapter extends FragmentStatePagerAdapter {

	private List<Fragment> list;

	public TabPagerAdapter(FragmentManager fm,List<Fragment> list) {
		super(fm);
		this.list=list;
	}

	@Override
	public Fragment getItem(int position) {
		return list.get(position);
	}

	@Override
	public int getCount() {
		return list.size();
	}

}

5.fragment的布局

<?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" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="127dp"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

最终效果图:




先看效果: https://pan.quark.cn/s/c7070e7537b1 [!NOTE] 每到答辩季我就会喜获stars,谢谢大家的支持! 欢迎推广传播本repo(https://.com/atomiechen/THU-PPT-Theme),也欢迎贡献变体,提供更多选择 清华简约主题PPT模板 Repo stars 2020年春夏之交,答辩期间很多同学都在寻找清华主题的答辩模板。 一方面有使用LaTeX制作Beamer的模板(见Overleaf上的模板THU Beamer Theme),另一方面民间也存在着一些PPT模板。 很多人可能不适应Beamer的使用(主要是内容和排版设计不是可见即所得,定制有门槛),以及我找到的PPT模板也都不太好使(要么图案设计太复杂、不好看,要么没有制作成PPT母版导致每次使用都要复制粘贴+微调,不方便)。 我制作了清华简约主题的PPT模板,后续有新的设计我会逐渐加入,也欢迎有兴趣有想法的朋友们添砖加瓦! 内容 所有模板均为 文件。 此外也提供转换脚本用于 Pandoc自动生成PPTX。 各个版本的修改历史见 CHANGELOG.md。 下载 推荐直接从 Releases 下载最新发布版。 也可以在 仓库 单独下载所需文件。 效果 16:9比例,v1留边、v1顶边、v3留边白底、v3顶边白底: demo 16:9比例,其他风格模板:v1扁平、v2扁平、v1暗光 demo2 其他变体设计参见 variants/README.md。 使用方式 可以基于所提供的文件自行修改内容,也可以在新建的PPT文稿中应用该模板。 后者在 MS Office 2019 For Mac 的 PowerPoint 里的具体使用方式为:首先选择幻灯片尺...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值