一、老套的实现方式ActivityGroup+Activitys官方早已不推荐使用
二、Fragment的出现时替代Activity在UI交互与布局方面的利器,当然Fragment页夹带着各种褒贬不一的吐槽。
三、Fragment和其他Android组件之间搭档可实现多种多样的复杂布局和适配效果,这篇记录的是练习时的随手记录,欢迎批评指正,后期有空可能将会继续整理其他组件与之搭配实现主界面框架的效果。
四、代码很简洁,加上引导包总共不超过100行,但是麻雀虽小却五脏俱全,你需要了解一下内容,因为本文不会描述一下基本概念,这是笔者的一贯作风:
(1)Framment的是生命周期以及与Activity生命周期之间的关系
(2)如何提高Fragment加载方法带来的效率问题,例如replace()\add()与hide()\show()的巧妙使用
(3)Java反射的使用,如果不理解反射用法,可以查看我的Java进阶博客(依旧不会讲解一些基本理论知识);
(4)你可能会有Fragment兼容性的问题提问,我只能告诉你的编译版本API>11
五、话不多说,上代码!
package jx.czh.com.appstructure.activitys;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.widget.RadioGroup;
import java.util.ArrayList;
import jx.czh.com.appstructure.R;
import jx.czh.com.appstructure.utils.PackageUtils;
public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener {
private static ArrayList<String> mainFragments;
private Context context = MainActivity.this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainFragments = PackageUtils.getMainFragments();
changeFragment(PackageUtils.FRAGEMENT_HOME);
RadioGroup radiogroup_main = (RadioGroup) findViewById(R.id.radiogroup_main);
radiogroup_main.setOnCheckedChangeListener(this);
}
/**
* 切换布局页面
*
* @param tag fragment对应的Tag标示(用Fragment的类名作为其Tag)
*/
private void changeFragment(String tag) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = manager.findFragmentByTag(tag);
if (fragment == null) {
try {
fragment = (Fragment) Class.forName(tag).newInstance();
} catch (Exception e) {
}
transaction.add(R.id.fragments, fragment, tag);
} else {
transaction.show(fragment);
}
for (int i = 0; i < mainFragments.size(); i++) {
Fragment tempF = manager.findFragmentByTag(mainFragments.get(i));
if (tempF != null && !tempF.getTag().equals(tag)) {
transaction.hide(tempF);
}
}
transaction.commit();
}
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
switch (i) {
case R.id.radioBtnHome:
changeFragment(PackageUtils.FRAGEMENT_HOME);
break;
case R.id.radioBtnBook:
changeFragment(PackageUtils.FRAGEMENT_BOOK);
break;
case R.id.radioBtnMy:
changeFragment(PackageUtils.FRAGEMENT_MY);
break;
}
}
}
2017年1月7日 框架补充
#核心技术评估
##UI框架
- TabLayout+ViewPager+ScrooView+Fragment(懒加载)+RecyclerView的APP主框架经得起考验,用户体验提高很多,
ViewPager嵌套ViewPager要尽量避免,一旦使用要小心高度适配。
建议;可推行使用
##网路框架
- Retrofit+RxJava+Interface使用代码量较大,没有自己封装之后的Volley精简,对于数据的统一性处理也不简便。
建议:无特殊需求使用Volley,但这并不意味着Retrofit毫无用处,其实Retrofit有很多值得使用的地方,比如上下文关联的请求方式。
##全局异常处理
- APP UncaughtExceptionHandler不加上网络,价值没有体现出来
建议:跟后台结合,做一个自己的bug统计后台
##分类筛选
- EventBus可以方便的解耦二级及以上列表数据处理,但是只是制定一个EventBus大体规则,每次使用还是比较繁琐的任务
建议:将加入Fragment和数据动态结合,将数据模块和UI模块分离
##图片缓存处理
- Glide这个Google开源的图片缓存库灵活强大,经得起项目的考验推荐使用,不需要再沿用之前自己封装的二级缓存框架
##公共CommonAdapter
- 使用效果还不错,但是封装的还不够完善,因为RecycelrView的功能不仅仅是简单的展示列表数据,需要在补充其他的对外接口,可以搞一个接口适配器方便添加
##信息提示
- SnackUtil:SnackBar简单使用和可以,关于显示位置的控制可以参考popwindow的方式改进,除了提供默颜色(使用和主题颜色一样的颜色)和布局外提供用户自定义颜色和布局接口
##总结
- UI框架可以沿用Tablayout_ViewPager+Fragment
- 网络框架沿用Volley(舍弃缓存框架)
- 图片缓存框架使用Glide
- 列表适配器使用CommonAdapter(需要进一步完善:添加增删和手势处理接口)
- 信息通知使用SnackBar(需要进一步完善:自定义位置,自定义UI)
- 分类列表需要进一步封装