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

要实现以下效果:

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



猜你喜欢

转载自blog.csdn.net/a600849155/article/details/78208673