利用newInstance快速搭建tablayout与viewpager的简单UI框架

来源:互联网 发布:vim java开发环境 编辑:程序博客网 时间:2024/06/14 15:11
newInstance 与 new 创建片段Fragment有区别:
newInstance利用类加载机制创建对象,是工厂模式常用的一种形式。
newInstance创建对象时,只能调用无参数的构造方法,效率相对低

new 创建时可以调用任何的构造方法。

我们知道利用Java的反射可以得到一个类的构造方法,比如:

getConstructor

public Constructor<T> getConstructor(Class<?>... parameterTypes)     

parameterTypes参数是class对象的一个数组,这些class的声明顺序对应该类的构造方法的形参类型。

如果class对象表示的是非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭实例!

红字部分起初 我也不是不明白什么意思,经过验证,大概是说,如果我们要通过getConstructor(Class<?>...param)这个方法

得到内部类构造方法的情况,那么作为参数的parameterTypes必须是这个内部类的外部类.class!!

同样在getConstructor(Class<?>...param).newInstance(object...args),这里的args也必须是外部类对象作为参数传入!


接下来我们继续搭建viewpager,我们利用
com.android.support:design:25.0.0包底下的tabLayout可以快速的搭建viewpager选项卡框架.
布局文件如下:
 <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="48dp">
    </android.support.design.widget.TabLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tab"
        >

    </android.support.v4.view.ViewPager>


MainActivity:

public class MainActivity extends AppCompatActivity {

    private HashMap<Class, CraftFragment> mFragments = new HashMap<>();
    private Class[] mFragmentClass = {TestFragment.class, TestFragment2.class, TestFragment23.class};

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

        TabLayout tab = (TabLayout) findViewById(R.id.tab);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

        MyFragmentAdapter myFragmentAdapter = new MyFragmentAdapter(getSupportFragmentManager());

        viewPager.setAdapter(myFragmentAdapter);
        tab.setupWithViewPager(viewPager);
        tab.setTabTextColors(Color.GRAY, Color.BLUE);
        tab.setSelectedTabIndicatorColor(Color.BLUE);
    }

    private CraftFragment getFragment(int pos){

        Class clzs = mFragmentClass[pos];
        CraftFragment craftFragment = mFragments.get(clzs);

        if(craftFragment == null){

            try {
                craftFragment = (CraftFragment) clzs.newInstance();
                Bundle bundle = new Bundle();
                bundle.putString("name", clzs.getSimpleName());
                craftFragment.setArguments(bundle);
                mFragments.put(clzs, craftFragment);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return mFragments.get(clzs);
    }


    private class MyFragmentAdapter extends FragmentPagerAdapter{

        String[] titles = {"第一页","第二页","第三页"};

        public MyFragmentAdapter(FragmentManager fm) {
            super(fm);
        }


        @Override
        public Fragment getItem(int position) {
            return getFragment(position);
        }


        @Override
        public int getCount() {
            return mFragmentClass.length;
        }


        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    }
}
其中我们调用getFragment();的方法 利用newInstance实例化了Fragment,然后存储在mFragments中,避免重复实例化对象。
来看看片段的代码:
/**
 * Created by chensd on 2016/10/26.
 */
public class TestFragment extends CraftFragment {


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        if(null != bundle){
            String name = bundle.getString("name");
            Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_test, null);
    }

}


craftFragment是我创建的一个空fragment,可以在此写一些片段的通用初始操作!(可以直接无视这个类)

源码地址:

http://download.csdn.net/detail/qq_32640763/9665376


0 0
原创粉丝点击