利用newInstance快速搭建tablayout与viewpager的简单UI框架
来源:互联网 发布:vim java开发环境 编辑:程序博客网 时间:2024/06/14 15:11
newInstance 与 new 创建片段Fragment有区别:
newInstance利用类加载机制创建对象,是工厂模式常用的一种形式。
newInstance创建对象时,只能调用无参数的构造方法,效率相对低
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"
>
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);
}
}
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也必须是外部类对象作为参数传入!
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
- 利用newInstance快速搭建tablayout与viewpager的简单UI框架
- TabLayout的简单使用(TabLayout+Fragment+ViewPager)
- 利用eclipse简单快速的搭建SSH框架
- TabLayout+viewpager的简单使用
- Tablayout+Viewpager的简单使用
- TabLayout与ViewPager的使用
- tablayout与viewpager的结合
- Tablayout与viewpager的联动
- TabLayout与ViewPager的联动
- 使用TabLayout与ViewPager简单快速实现底部导航栏效果
- 利用TabLayout和fragment搭建app框架
- TabLayout和ViewPager的简单联用
- TabLayout配合viewpager的简单使用
- TabLayout加ViewPager的简单使用
- TabLayout和ViewPager的简单使用
- Android中TabLayout+ViewPager的简单使用
- 简单快捷的Amaze UI框架搭建
- TabLayout与ViewPager与viewFlipper的使用
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用
- 同步异步阻塞非阻塞
- 第九周项目2-对称矩阵压缩存储的实现与应用(1)
- ReactJS组件间沟通的一些方法
- myeclipse安装maven ,并且创建maven项目
- 利用newInstance快速搭建tablayout与viewpager的简单UI框架
- 第九周 项目2 对阵矩阵存储的实现与应用
- 如何在jsp里面写java代码
- Android存储使用参考
- 第九周 项目3-稀疏矩阵的三元组表示的实现及应用 (1)
- CRUD 反射 泛型
- 【第七周 项目5-排队看病模拟】
- Java 集合:LinkedHashMap工作原理及实现
- Plsql 使用技巧