DrawerArrowDrawable + FragmentTabHost +PagerSlidingTabStrip 高仿开源中国客户端
来源:互联网 发布:淘宝注册商家信息表格 编辑:程序博客网 时间:2024/06/07 19:12
要实现以下效果:
mainActivity文件主要实现了自定义选项卡以及加载DrawerArrowDrawable,而加载FragmentTabHost 是在MainTab里面实现的:
写了一个基类之后想要为”综合“添加一个ViewpagerFragment就简单得多了:
先上mainActivity:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, View.OnClickListener, TabHost.OnTabChangeListener, View.OnTouchListener {// @InjectView(android.R.id.tabhost)// public MyFragmentTabHost mTabHost;// @InjectView(R.id.quick_option_iv)// View mAddBt; //建两个全局变量,等下用它们获取layout里面的两个控件 private ViewPager vp; private PagerSlidingTabStrip pst; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); initFramentHost(); View mAddBt = (View)findViewById(R.id.quick_option_iv);// 中间按键图片触发,并且触发按键图片的selector资源 mAddBt.setOnClickListener(this); mAddBt.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } });// } private void initFramentHost() { MyFragmentTabHost mTabHost = (MyFragmentTabHost) findViewById(android.R.id.tabhost);// 初始化底部FragmentTabHost mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); mTabHost.setCurrentTab(0); mTabHost.setOnTabChangedListener(this); MainTab[] tabs = MainTab.values(); final int size = tabs.length; for (int i = 0; i < size; i++) { // 找到每一个枚举的Fragment对象 MainTab mainTab = tabs[i]; // 1. 创建一个新的选项卡 TabHost.TabSpec tab = mTabHost.newTabSpec(getString(mainTab.getResName())); // ------------------------------------------------- 自定义选项卡 ↓ View indicator = LayoutInflater.from(getApplicationContext()) .inflate(R.layout.tab_indicator, null); TextView title = (TextView) indicator.findViewById(R.id.tab_title); Drawable drawable = this.getResources().getDrawable( mainTab.getResIcon()); title.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); if (i == 2) { indicator.setVisibility(View.INVISIBLE); mTabHost.setNoTabChangedTag(getString(mainTab.getResName())); } title.setText(getString(mainTab.getResName())); tab.setIndicator(indicator); Bundle bundle = new Bundle(); bundle.putString("key", "content: " + getString(mainTab.getResName())); // 2. 把新的选项卡添加到TabHost中 mTabHost.addTab(tab, mainTab.getClz(), bundle); mTabHost.getTabWidget().getChildAt(i).setOnTouchListener(this); } } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { ToastUtil.showToast(this,"settings"); } if(id == R.id.action_share){ ToastUtil.showToast(this,"share"); } if(id == R.id.search){ ToastUtil.showToast(this,"search"); } return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } @Override public void onClick(View view) { } @Override public void onTabChanged(String s) { } @Override public boolean onTouch(View view, MotionEvent motionEvent) { return false; }}
mainActivity文件主要实现了自定义选项卡以及加载DrawerArrowDrawable,而加载FragmentTabHost 是在MainTab里面实现的:
/** * 这里负责加载tabhost以及fragment */public enum MainTab { NEWS(0, R.string.main_tab_name_news, R.drawable.tab_icon_new, NewsPagerFragment.class),//第三个参数是fragment代码 TWEET(1, R.string.main_tab_name_tweet, R.drawable.tab_icon_tweet, TweetPagerFragment.class), QUICK(2, R.string.main_tab_name_quick, R.drawable.tab_icon_new, null), EXPLORE(3, R.string.main_tab_name_explore, R.drawable.tab_icon_explore, ExplorePagerFragment.class), ME(4, R.string.main_tab_name_my, R.drawable.tab_icon_me, DefaultFragment.class); private int idx; private int resName; private int resIcon; private Class<?> clz; private MainTab(int idx, int resName, int resIcon, Class<?> clz) { this.idx = idx; this.resName = resName; this.resIcon = resIcon; this.clz = clz; } public int getIdx() { return idx; } public void setIdx(int idx) { this.idx = idx; } public int getResName() { return resName; } public void setResName(int resName) { this.resName = resName; } public int getResIcon() { return resIcon; } public void setResIcon(int resIcon) { this.resIcon = resIcon; } public Class<?> getClz() { return clz; } public void setClz(Class<?> clz) { this.clz = clz; }}
这样就实现了一个带有FragmentTabHost 和DrawerArrowDrawable的一个基本界面了。然后我们要给每一个Frament添加一个Viewpagerfragment,由于有三个Fragment我们没可能每次都写一次,所以就写一个基类:
package com.example.administrator.oschina.base;//**import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.astuetz.PagerSlidingTabStrip;import com.example.administrator.oschina.R;import com.example.administrator.oschina.adapter.ViewPagerFragmentAdapter;//*带有导航条的基类// *// *// *// */public abstract class BaseViewPagerFragment extends Fragment { private PagerSlidingTabStrip mTabStrip;// private ViewPagerFragmentAdapter mTabsAdapter; private ViewPager mViewPager;//展示内容用的滚动布局ViewPager protected ViewPagerFragmentAdapter mTabsAdapter; // 封装了数据集合的ViewPager适配器 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 填充并返回一个公共的包含导航条和ViewPager的界面 View view = inflater.inflate(R.layout.base_viewpage_fragment, null); mTabStrip = (PagerSlidingTabStrip)view.findViewById(R.id.pager_tabstrip); mViewPager = (ViewPager)view.findViewById(R.id.pager); Toolbar toolbar = (Toolbar)view.findViewById(R.id.toolbar); ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // 1.封装adapter, 注意这里是继承的FragmentPagerAdapter, // 并且传入的是getChildFragmentManager() mTabsAdapter = new ViewPagerFragmentAdapter(getActivity(),getChildFragmentManager()); //2.添加page页 addPageToAdapter(mTabsAdapter); //3.设置adapter mViewPager.setAdapter(mTabsAdapter); //4.绑定viewPager到Indicator mTabStrip.setViewPager(mViewPager); setScreenPageLimit(mViewPager); } /** * 设置ViewPager能够缓存的页数 */ protected void setScreenPageLimit(ViewPager mViewPager) { mViewPager.setOffscreenPageLimit(mViewPager.getAdapter().getCount()-1); } /** * 往Adapter中添加page * * @param fragmentAdapter */ protected abstract void addPageToAdapter( ViewPagerFragmentAdapter fragmentAdapter);}
写了一个基类之后想要为”综合“添加一个ViewpagerFragment就简单得多了:
public class NewsPagerFragment extends BaseViewPagerFragment { @Override protected void addPageToAdapter(ViewPagerFragmentAdapter fragmentAdapter) { String[] titles = getActivity().getResources().getStringArray( R.array.news_viewpage_arrays);//获取新闻tablayout的四个viewpager //添加page,并给fragment传入对应的bundle参数,在请求接口的时候用 fragmentAdapter.addPage(titles[0], DefaultFragment.class, getBundle(NewsList.CATALOG_ALL)); fragmentAdapter.addPage(titles[1], DefaultFragment.class, getBundle(NewsList.CATALOG_WEEK)); fragmentAdapter.addPage(titles[2], DefaultFragment.class, getBundle(BlogList.CATALOG_LATEST)); fragmentAdapter.addPage(titles[3], DefaultFragment.class, getBundle(BlogList.CATALOG_RECOMMEND)); } private Bundle getBundle(int newType) {//通过适配器得到要传输的值 Bundle bundle = new Bundle(); bundle.putInt(BaseListFragment.BUNDLE_KEY_CATALOG, newType); bundle.putString("key", "我是综合里的: " + newType); return bundle; } /** * 基类会根据不同的catalog展示相应的数据 * * @param catalog * 要显示的数据类别 * @return */ private Bundle getBundle(String catalog) { Bundle bundle = new Bundle(); // bundle.putString(BlogFragment.BUNDLE_BLOG_TYPE, catalog); bundle.putString("key", "我是综合里的: " + catalog); return bundle; } }
同理可以把另外两个fragment的Viewpager也弄出来,其中由于笔者选择的是PagerSlidingTabSrip这个开源插件所以要在baseViewpagerfragment的xml文件上面加上pagerSlidingTabStrip:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:pstsTabPaddingLeftRight="http://schemas.android.com/tools" android:orientation="vertical"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <com.astuetz.PagerSlidingTabStrip android:id="@+id/pager_tabstrip" android:layout_width="match_parent" android:layout_height="30dp" android:background="@drawable/sliding_tab_strip_background" app:pstsShouldExpand="true" app:pstsIndicatorColor="@color/actionbar_background" > </com.astuetz.PagerSlidingTabStrip> <android.support.v4.view.ViewPager android:id="@+id/pager" style="@style/fill_fill" android:layout_below="@id/pager_tabstrip" > </android.support.v4.view.ViewPager></LinearLayout>
至此项目效果就差不多实现了,要想更详细的代码可以在以下地址查看:
https://github.com/600849155/OsChina
阅读全文
0 0
- DrawerArrowDrawable + FragmentTabHost +PagerSlidingTabStrip 高仿开源中国客户端
- PagerSlidingTabStrip
- PagerSlidingTabStrip
- Android两级导航菜单栏的实现--FragmentTabHost结合ViewPager与Android 开源项目PagerSlidingTabStrip
- Android两级导航菜单栏的实现--FragmentTabHost结合ViewPager与Android 开源项目PagerSlidingTabStrip
- ChrisRenke/DrawerArrowDrawable源码解析
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabHost
- FragmentTabhost
- FragmentTabHost
- Spring AOP实现
- Python 递归,遍历文件夹有层次感
- 项目第二天(补)
- python3 高阶函数基础
- android调用拨号程序
- DrawerArrowDrawable + FragmentTabHost +PagerSlidingTabStrip 高仿开源中国客户端
- 用python实现5种不同回归方法
- Android Service服务
- jdbc事务和事务的隔离级别
- 笔试10.11
- springcloud(十)
- 前端图片加载优化
- 多线程TCP通信
- centos6.5安装配置