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原理类似)。

ConstrainLayout约束布局
优势:

  • 扁平化,即在布局内嵌套布局,只套一层或少量的几层布局,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
  1. 在Activity里绑定Adapter
    5.设置切换、滑动动画
posted @ 2017-09-30 14:29  客伞  阅读(379)  评论(0编辑  收藏  举报