利用newInstance快速搭建tablayout与viewpager的简单UI框架
2016-10-27 10:37
465 查看
newInstance 与 new 创建片段Fragment有区别:
newInstance利用类加载机制创建对象,是工厂模式常用的一种形式。
newInstance创建对象时,只能调用无参数的构造方法,效率相对低
new 创建时可以调用任何的构造方法。
我们知道利用Java的反射可以得到一个类的构造方法,比如:
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
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
相关文章推荐
- 框架搭建之首页风格一 Material Design风 第一话(Fragment +ViewPager+TabLayout)
- android app主题UI界面框架搭建 tablayout+Viewpager+fragment 导航栏滑动和点击切换界面
- CommonTabLayout+ViewPager快速完成APP首页搭建
- 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment
- 利用TabLayout(5.0新技术)+ViewPager+Fragment方法实现书签导航
- 一个案例教你简单地玩转ViewPager(二)之ViewPaper+TabLayout+Fragment顶部标签界面滑动
- Design下的TabLayout和Fragment和ViewPager联动的简单使用
- 利用TabLayout和fragment搭建app框架
- 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment
- 节日短信中TabLayout+viewPager的简单使用
- 关于Design包中TabLayout+ViewPager的简单使用
- React Native从零开始(九)ViewPagerAndroid的使用,和简单框架搭建
- TabLayout+ViewPager简单使用
- Android中TabLayout+ViewPager 简单实现app底部Tab导航栏
- TabLayout+ViewPager的简单使用
- TabLayout的简单使用(TabLayout+Fragment+ViewPager)
- 简单优雅的使用tablayout和viewpager打造导航栏
- Android高级UI之ViewPager实现页卡的最新方法-简洁的TabLayout
- 节日短信中TabLayout+viewPager的简单使用