您的位置:首页 > 产品设计 > UI/UE

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

2016-10-27 10:37 435 查看
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/ta
9eb0
b"

        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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: