DrawerArrowDrawable + FragmentTabHost +PagerSlidingTabStrip 高仿开源中国客户端

来源:互联网 发布:淘宝注册商家信息表格 编辑:程序博客网 时间:2024/06/07 19:12

要实现以下效果:

先上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



原创粉丝点击