Android笔记之Activity、Fragment

安卓四大常用组件之一:Activity(活动)

创建组件的流程如下:

  • 编写相应的组件类
  • 在AndroidManifest.xml中注册

Activity的子类如下:

//最基本的活动类
android.app.Activity

//提供列表控件的活动类
andoid.app.ListActivity

//支持碎片(Fragment)的活动类
android.support.v4.app.FragmentActivity

//支持ActionBar的活动类,应用主题是Theme.AppCompat
android.support.v7.app.AppCompatActivity

活动生命周期:多个活动由Task管理。

三种状态:

  • 运行状态:进入前台,位于栈顶。
  • 暂停状态:当前活动不在栈顶,但仍可见
  • 停止状态:当前活动不在栈顶,完全覆盖,仍然保存所有状态,容易被GC回收。

七个方法:

  • onCreate():活动初始化时调用。
  • onStart():活动从不可见变为可见,但无法获得焦点。
  • onResume():从暗色变为高亮,可以获得焦点。
  • onPause():从运行到暂停状态调用该方法。
  • onStop():从暂停状态到停止这状态调用该方法。
  • onRestart():处于停止状态的活动,重新回到前台,变成活动状态。
  • onDestroy():活动被销毁时调用。

三个嵌套:

  • 整个生命周期的循环:onCreate()---->onDestory()
  • 可见生命周期的循环:onStart()----->onStop()
  • 前台生命周期的循环:oResume()-------->onPause()

Back键和Home键:

  • Back:从栈中移除活动。
  • Home:将Android桌面活动入栈。

活动之间的跳转:

Intent intent = new Intent(XXXActivity.this , XXXActivity.this);
// 启动下一个活动
void startActivity(Intent intent) 

Intent是一个意图对象,意图附加数据(Extras)字段:通过键值对来保存数据。

单值参数:

  • putExtras(String name,String value)
  • putExtras(String name,int value)

多值参数:

  • putExtras(String name,int [] value)
  • putExtras(String name,Serializable value)

在接收的Activity中:

//获取意图、获取对象
Intent intent= this.getIntent();
Bundle bundle = intent.getExtras();
String userId = bundle.getString(“userId”);

Bundle的各式Getter方法

  • getInt(String key)
  • getString(String key)
  • getSerializable(String key)

当前Activity中:(Activity之间跳转并返回值)

// 跳转需要返回值code
void startActivityForResult(Intent intent ,int requestCode)

// 需要重写方法
onActivityResult(int request,int resultCode,Intent data)

接收的Activity:

setResult(resultCode,(new Intent()),putExtra("userId",userId))

活动任务与返回栈:

任务相关的意图标志(Flag):

  • FLAG_ACTIVITY_NEW_TASK  //开始一个新任务
  • FLAG_ACTIVITY_CLEAR_TOP //清除返回栈中的活动
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP)

Fragment:

目的:为了适配多种设备和屏幕尺寸(平板电脑、电视),碎片是用来描述活动的部分界面

注:通过活动实现两个碎片之间的通信和调用

Fragment的生命周期:

三种状态:

  • 运行状态:可见,可获得焦点
  • 暂停状态:可见,变暗,不可获得焦点
  • 停止状态:碎片所在活动处于停止状态

11个方法:

  • onAttach():与活动建立关联
  • onCreate():创建、初始化碎片
  • onCreateView():第一次绘制相关视图,返回值是相关视图
  • onActivityCreated():所在活动创建完成
  • onStart():所在活动从不可见变为可见,不能获得焦点
  • onResume():所在活动从暗色变为高亮,可以获得焦点、接收事件
  • onPause():碎片从运行状态到暂停状态
  • onStop():碎片从暂停状态到停止状态
  • onDestroyView():销毁碎片相关视图
  • onDestroy():碎片被销毁
  • onDeach():碎片与活动解除关系时调用

碎片相关类:

  • FragmentActivity:V4包
  • APPcompatActivity:V7包
  • Activity
  • Fragment:核心碎片类
  • FragmentManager:管理碎片所在活动之间的交互和通信。
  • FragmentTransaction:管理碎片事务
  • ListFragment:包含ListView控件的碎片类
  • DialogFragment:浮在活动窗口的碎片

注:列表类型碎片ListFragment、通过代码创建布局,不需要指定布局文件,不需要重写onCreateView()方法。

静态添加碎片到活动:不能在运行时动态删除和替换

通过FragmentManager:

  • Fragment findFragmentById(int id)
  • Fragment findFragmentByTag(String tag)//Fragment下的标签

动态添加碎片到活动:

通过碎片事务FragmentTransaction完成,重写onCreate()方法:

//创建碎片实例
EventsMasterFragment firstFragment=new EventsMasterFragment();

//FragmentManager对象
FragmentManager fragmentManager=new EventMasterFragment();
        
//获得FragmentTransaction对象
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        
//添加firstFragment碎片到fragment_container容器
fragmentTransaction.add(R.id.fragment_container,firstFragment);

//提交碎片
fragmentTransaction.commit();

管理碎片事务:

添加:

删除:

getFragmentManager().beginTransaction().remove(new EventsMasterFrament()).commit();

替换:

getFragmentManager().beginTransaction().replace(R.id.fragment_container,new EventsMasterFrament())
//.addToBackStack(null) //将碎片添加返回栈,可以返回上一个碎片
.commit();

碎片与活动之间的通信:

一号路线:

MainActivity activity = (MainActivity)getActivity();

二号路线:

EventsDetailFragment detailFragment = (EventsDetailFragment) getFragmentManager().findFragmentById(R.id.fragment_detail);

实例:手机显示和平板显示

创建两个碎片:

Master碎片:

//返回所有项目名称String集合
String[] titles = new String[EventsDAO.list.size()];
for(int i=0;i<titles.length;i++){
    Events e=EventsDAO.list.get(i);
    titles[i]=e.getName();
}
setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_activated_1,titles));

Detail碎片:

//设置详细视图
    public void updateDetailView(int position) {

        // 获取选中的比赛项目
        Events events = EventsDAO.list.get(position);
        // 获取当前碎片所在的活动
        Activity activity = this.getActivity();

        // 获得碎片中的ImageView对象
        ImageView imageView =(ImageView) activity.findViewById(R.id.imageView_detail);
        imageView.setImageResource(getLogoResId(events.getLogo()));

        // 获得碎片中的TextView对象
        TextView textView = (TextView) activity.findViewById(R.id.textView_detail);
        textView.setText(events.getDescription());
        mCurrentPosition = position;
    }


    // 通过logo资源文件名获得资源id
    private int getLogoResId(String logo) {

        // 获得活动的包名
        String packageName = this.getActivity().getPackageName();

        // 截取掉文件后缀名
        int pos = logo.indexOf(".");
        String logoFile = logo.substring(0, pos);

        // 资源文件名获得资源id
        int resId = this.getActivity().getResources()
                //参数:1.图片文件名2.资源文件类型3.资源文件包
                .getIdentifier(logoFile, "mipmap", packageName);

        return resId;
    }

创建MainActivity活动:

 if(findViewById(R.id.fragment_container)!=null){
            if(savedInstanceState!=null){
                return;
            }

            // 创建碎片实例
            EventsMasterFragment firstFragment=new EventsMasterFragment();

            // 将意图的扩展数据(Extras),放到碎片参数中
            firstFragment.setArguments(getIntent().getExtras());

            // 获得FragmentManager对象
            FragmentManager fragmentManager=getFragmentManager();

            // 获得FragmentTransaction对象
            FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();

            // 添加firstFragment碎片到fragment_container容器
            fragmentTransaction.add(R.id.fragment_container,firstFragment);

            // 提交碎片
            fragmentTransaction.commit();

    }

手机和平板加载不同的activity_mian.xml:

 //用户从Master碎片选中列表项时调用
    @Override
    public void onEventsSelected(int position) {

        // 使用FragmentManager通过id获得详细碎片
        EventsDetailFragment detailFragment = (EventsDetailFragment)getFragmentManager().findFragmentById(R.id.fragment_detail);

        if (detailFragment != null) {
            // 如果Detail碎片可用,则说明是两栏布局情况
            // 调用该方法更新Detail碎片内容
            detailFragment.updateDetailView(position);
        } else {
            // 如果Detail碎片不可用,则说明是单栏布局情况
            // 创建新的Detail碎片
            EventsDetailFragment newFragment = new EventsDetailFragment();
            Bundle args = new Bundle();
            args.putInt(EventsDetailFragment.EVENTS_, position);
            newFragment.setArguments(args);
           

            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            // 替换fragment_container中的原有碎片
            transaction.replace(R.id.fragment_container, newFragment);

            // 添加碎片事务到返回栈,以便于用户单击Back能够导航回到上一个碎片
            transaction.addToBackStack(null);

            // 提交碎片事务
            transaction.commit();
        }
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值