市场上的应用现状区域同质化,尤其是各种安卓App的框架,基本使用技术及原理,包括网络框架,框架的逻辑处理基本相同。
最常见的新浪的新闻客户端,开源中国客户端,淘宝客户端,京东商城的客户端。
最显眼的就是每一个App都是由5ge可选择的button,配合fragment的切换实现。
今天就着手从开源中国客户端的原理基础上讲一讲这种底部的几个button,上面是viewpager加上indicator的常见框架,先给张图看看。
上面的这个软件是自己有空的时候模仿的,后面会提供源码及框架,不同于开源中国APP的源码,源码比较复杂,不适合新手的学习。
上面最基本的布局就是底部一个tabhost,上面一个viewpager切换底部button的时候会显示不同的fragment。
但是仔细看发现,这个viewpagerr切换里面的内容是一个indicator加上viewpager实现的,那么对于这种框架如何去实现呢?
其实这个这个是一个非常典型的fragment嵌套fragment的应用。
外部是viewpager切换去加载fragment,里面是fragment里面包含fragmen每个fragment及indicator,其实就是fragment的嵌套。
先给个图看看。
上面的这个图其实是上面那个大图中扣取的部分小图,我们知道动弹和综合都是一个fragment。
我们用mainactivity去模拟这个fragment区实现动弹与综合界面的抽取
MainActivity代码,这里啥都没干
package com.example.administrator.kuangjiaviewpagerfragment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
activity_main布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context="com.example.administrator.kuangjiaviewpagerfragment.MainActivity"> <fragment android:id="@+id/fra" android:name="com.example.administrator.kuangjiaviewpagerfragment.fragment.TweetFragment" android:layout_width="match_parent" android:layout_height="match_parent"></fragment> </LinearLayout>
这里是把fragment引进来,相当于最外层的fragment。
BaseFragment抽取的基类
package com.example.administrator.kuangjiaviewpagerfragment.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.astuetz.PagerSlidingTabStrip; import com.example.administrator.kuangjiaviewpagerfragment.R; import java.util.ArrayList; import java.util.List; /* * @项目名: KuangjiaViewPagerFragment * @包名: com.example.administrator.kuangjiaviewpagerfragment.fragment * @文件名: BaseFragment * @创建者: Administrator * @创建时间: 2016/7/30 18:08 * @描述: TODO */ public abstract class BaseFragment extends Fragment { private static final String TAG = "BaseFragment"; private String[] mTitles; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.contentmain, null); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ViewPager pager = (ViewPager) view.findViewById(R.id.pager); PagerSlidingTabStrip tag = (PagerSlidingTabStrip) view.findViewById(R.id.tag); Myadapter myadapter = new Myadapter(getChildFragmentManager()); mTitles = getMtitles(); /*myadapter.addTag(new dafaultfragment()); myadapter.addTag(new dafaultfragment()); myadapter.addTag(new dafaultfragment()); myadapter.addTag(new dafaultfragment());*/ setupAdapter(myadapter); pager.setAdapter(myadapter); tag.setViewPager(pager); } protected abstract String[] getMtitles(); protected abstract void setupAdapter(Myadapter myadapter); //这是以前的写法,现在的写法不用view,用fragment /* class Myadapter extends PagerAdapter{ @Override public int getCount() { return 0; } @Override public boolean isViewFromObject(View view, Object object) { return false; } }*/ class Myadapter extends FragmentPagerAdapter { // List<Fragment> mList=new ArrayList<>(); List<TabInfo> mList = new ArrayList<>(); public void addTag(String title, Class clazz, String args) { mList.add(new TabInfo(title,clazz,args)); } public Myadapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return Fragment.instantiate(getActivity(), mList.get(position) .getClazz() .getName(), prePageTitles(mList.get(position) .getArgs())); } @Override public int getCount() { return mList.size(); } public Bundle prePageTitles(String args) { Bundle bundle = new Bundle(); bundle.putString("key", args); return bundle; } @Override public CharSequence getPageTitle(int position) { return mList.get(position) .getTitle(); } class TabInfo { String title; Class clazz; String args; public TabInfo(String title, Class clazz, String args) { this.title = title;//标题 this.clazz = clazz;//字节码 this.args = args;//参数 } public String getTitle() { return title; } public Class getClazz() { return clazz; } public String getArgs() { return args; } public void setTitle(String title) { this.title = title; } public void setClazz(Class clazz) { this.clazz = clazz; } public void setArgs(String args) { this.args = args; } } } }
TweetFragment实现类
package com.example.administrator.kuangjiaviewpagerfragment.fragment; /* * @项目名: KuangjiaViewPagerFragment * @包名: com.example.administrator.kuangjiaviewpagerfragment.fragment * @文件名: TweetFragment * @创建者: Administrator * @创建时间: 2016/7/30 19:49 * @描述: TODO */ public class TweetFragment extends BaseFragment { private static final String TAG = "TweetFragment"; @Override protected String[] getMtitles() { return new String[0]; } @Override protected void setupAdapter(Myadapter myadapter) { myadapter.addTag("鸡鸡",dafaultfragment.class,null); myadapter.addTag("鸭鸭",dafaultfragment.class,null); myadapter.addTag("嬷嬷",dafaultfragment.class,null); myadapter.addTag("擦擦",dafaultfragment.class,null); } }
dafaultfragment具体实现的界面
所有界面的基类引用的局部package com.example.administrator.kuangjiaviewpagerfragment.fragment; 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; /* * @项目名: KuangjiaViewPagerFragment * @包名: com.example.administrator.kuangjiaviewpagerfragment.fragment * @文件名: dafaultfragment * @创建者: Administrator * @创建时间: 2016/7/30 18:25 * @描述: TODO */ public class dafaultfragment extends Fragment { private static final String TAG = "dafaultfragment"; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { TextView tv=new TextView(getContext()); tv.setText("这是fragmen种的fragment"); tv.setGravity(Gravity.CENTER); return tv; } }
contentmain
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:showIn="@layout/activity_main"> <!--ViewPagerIndicator | PagerSlidingTabStrip | TabLayout--> <com.astuetz.PagerSlidingTabStrip app:pstsShouldExpand="true" android:id="@+id/tag" android:layout_width="match_parent" android:layout_height="40dp"> </com.astuetz.PagerSlidingTabStrip> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/pager"/> </LinearLayout>
这是简单的实现,后续会更新网络框架的实现,包括每个子fragment的上拉及下拉刷新,还有简易版本的
开源中国的源码。写的不多,后面坚持多写自己的创意及领悟