Android项目开发Crime
Android项目开发
UIfragment与fragmentManager管理器
fragment是一种控制器对象,activity可委派它完成一些任务。通常这些任务就是管理用户界面。受管的用户界面可以使一整屏或是整屏的一部分。
管理用户界面的fragment又称为UI fragment。
activity视图含有可供fragment视图插入的位置。如果有多个fragment要插入,activity视图也可提供多个位置。
根据应用和用户的需求,可联合使用fragment及activity来组装或重新组装用户界面。在整个生命周期过程中,技术上来说activity的视图可保持不变。因此不用担心会违反Android系统activity规则(activity视图可在运行时切换,但控制视图的代码必须在activity中实现)。
选择不同的列表项会显示不同的明细视图,fragment很容易做到这一点。activity将以一个明细fragment替换另一个明细fragment。视图切换过程中,任何activity都无需被销毁。
用UI fragment将应用的UI分解成构建块,除列表明细应用外,也适用于其他类型的应用。利用一个个构建块,很容易做到构建分页界面、动画侧边栏界面等更多其他定制界面。
使用Fragment可以使得界面更为灵活,而且能够很好地适应不同尺寸的屏幕。建议使用支持库中的类(android.support.v4.app.*)来实现,可以通过升级项目的支持库从而使用到Fragment的最新的API特性。
使用Fragment管理用户界面步骤:
-
在AndroidStudio中添加依赖关系,这是因为要使用支持库就必须在项目中将其列入依赖关系。
-
创建CrimeActivity去继承FragmentActivity,因为FragmentActivity知道如何去管理Fragment。
Activity托管Fragment有两种方式:在Activity布局中添加(但是不够灵活),在Activity代码中添加(灵活性高,通常采用这种方式)。 -
在CrimeActivity的布局文件中为Fragment安排位置,通常采用FrameLayout容器视图。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
- 新建一个名为fragment_crime的xml文件,添加控件什么的。这就是CrimeFragment的布局文件
- 新建一个UIfragment类(继承Fragment),这就需要用到Fragment的生命周期相关的内容了。此类是利用onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)来实例化Fragment视图的布局,
将实例化的View返回给托管Avtivity,也就是CrimeActivity。这个过程将Fragment和Activity建立起了联系。还将Fragment和它的xml布局文件建立起了联系。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime,container,false);
return v;
}
- 必须是在Fragment中关联组件,并添加响应。
- FragmentManager负责将fragment的视图添加到Activity的视图结构中去。代码如下:
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if(fragment == null){
fragment = createFragment();
fm.beginTransaction().add(R.id.fragment_container,fragment).commit();
}
RecyclerView使用
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:
- 使用LayoutManager来确定每一个item的排列方式。
- 为增加和删除项目提供默认的动画效果。
- Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
- LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。
- 扁平化,即在布局内嵌套布局,只套一层或少量的几层布局,View的层级越少,渲染性能就好(关于view的界面渲染性能提升)。而且布局管理起来也会轻松一些。在constrainLayout中,以前嵌套好多层的布局,几乎可以只用一层就搞定了,效果好了太多。
- 灵活自适应:它提供了丰富的布局功能,包括RaletiveLayout所有的,设置准线,设置长宽比,设置比例布局,百分比等。基于此,它能够构建很灵活的布局,比如以前遗憾的不能在RelativeLayout中设置比例,而这里却能设置好多种比例,甚至到让你弄不懂的程度。而且由于不用管以前多层布局的约束,在ConatrainLayout里面布局具有良好的可扩展性,往后想要添加或改动布局,也要简易得多。
- 复杂的布局:即能用它搞定复杂的布局,其它单个布局做不到的它可以做到。
fragment argument使用
从fragment中启动Activity
1.首先创建CrimeActivity类
当点击CrimeListFragment中的某一个列表项时,启动CrimeActivity,用以显示每一项的详细信息。
public class CrimeActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
return new CrimeFragment();
}
}
2.修改CrimeListFragment中的onListItemClick方法:
创建一个intent,并附加extra信息,点击后启动CrimeActivity
public void onListItemClick(ListView l, View v, int position, long id) {
Crime crime= (Crime) getListAdapter().getItem(position);
Intent intent=new Intent(getActivity(),CrimeActivity.class);
intent.putExtra("extra_crimeId",crime.getUuid());
startActivity(intent);
}
3.修改CrimeFragment类中的onCreate方法, 获取extra信息,修改onCreateView方法,更新视图
使用fragment argument 传递数据
1.修改CrimeFragment类,新增newInstance方法,将信息封装在fragment实例中
public static CrimeFragment newInstance(UUID uuid){
Bundle bundle=new Bundle();
bundle.putSerializable("extra_crimeId",uuid);
CrimeFragment fragment=new CrimeFragment();
fragment.setArguments(bundle);
return fragment;
}
2.修改CrimeActivity类的createFragment方法,调用CrimeFragment的静态方法newInstance创建实例
protected Fragment createFragment() {
UUID uuid= (UUID) getIntent().getSerializableExtra("extra_crimeId");
return new CrimeFragment().newInstance(uuid);
}
3.修改CrimeActivity类的onCreate方法,将获取数据的方式该为getArgument ()
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// UUID id= (UUID) getActivity().getIntent().getSerializableExtra("extra_crmeId");
UUID id= (UUID) getArguments().getSerializable("extra_crimeId");
crime=CrimeLab.getInstance(getActivity()).getCrime(id);
}
4.在CrimeListFragment中重写onResume()方法刷新列表项
@Override
public void onResume() {
super.onResume();
((CrimeAdapter)getListAdapter()).notifyDataSetChanged();
}
5.通过fragment获取返回结果(修改CrimeListFragment的onListItemClick方法,重写onActivityResult方法)
调用Fragment.startActivityForResult()方法启动另一个Activity,调用Fragment.onActivityResult()方法获取返回信息
ViewPage使用
作用:
左右切换当前的view,实现滑动切换的效果。
- ViewPager类直接继承了ViewGroup类,和LinearLayout等布局一样,都是一个容器,需要在里面添加我们想要显示的内容。
- ViewPager类需要PagerAdapter适配器类提供数据,与ListView类似
使用:
1.在XML布局中加入android.support.v4.view.ViewPager
2.在MainActivity加载要显示的页卡
3.用相应的适配器Adapter关联上面的页卡(View/Fragment)和ViewPager:
- PagerAdapter 数据源:List
- FragmentPagerAdapter 数据源:List
- FragmentStatePagerAdapter 数据源:List
- 在Activity里绑定Adapter
5.设置切换、滑动动画