为了账号安全,请及时绑定邮箱和手机 立即绑定

Android开发中巧用Activity和Fragment

标签:
Android

原文链接

1.Activity的生命周期

1)多个Activity组成Activity栈,当前活动位于栈顶。我们先来看看各种Activity基类的类图:

Activity基类的类图

当Activity类定义出来之后,这个Activity何时被实例化、它所包含的方法何时被调用,这些都不是由开发者所决定的,都应该由Android系统来决定。

下面我们来看一下Activity的生命周期:

Activity的生命周期

2.Activity的用法

1)启动、关闭Activity

// 首先需要创建启动的Activity对应的IntentIntent intent = new Intent(MainActivity.this, TwoActivity.class);// 启动ActivitystartActivity(Intent intent);
startActivityForResult(Intent intent, int requestCode); // requestCode:请求码//startActivityForResult方法以指定的请求码启动Activity,并通过重写onActivityResult方法获取返回的结果。// 关闭Activityfinish();
finishActivity(int requestCode);// finishActivity方法结束以startActivityForResult方法启动的Activity。

2)启动其他Activity并返回结果

当前Activity重写onActivityResult(int requestCode, int resultCode, Intent intent)
requestCode:请求码(指出该方法是从哪个请求的结果触发的)
resultCode:Activity返回的结果码(指出返回的数据来自于哪个新的Activity)
被启动的Activity需要调用setResult()方法设置处理结果。

实例:

在当前Activity中重写onActivityResult方法

public class MainActivity extends Activity {
    Button bn;    @Override
    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        // 获取界面上的组件
        ...        // 绑定事件监听器
        bn.setOnClickListener(new OnClickListener() {            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, TwoActivity.class);
                startActivityForResult(intent, 0); // 0是请求码,用于标识该请求
            }
        });
    }    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {        // 处理特定的结果
        if (requestCode == 0 && resultCode == 0) {            // 取出Intent里的Extras数据
            Bundle data = intent.getExtras();            // 取出Bundle中的数据
            String result = data.getString("test");
            Toast.makeText(getApplicationContext(), result, 0).show();
        }
    }
}

然后在被启动的TwoActivity中调用setResult()方法设置处理结果

// 获取启动该Activity之前的Activity对应的IntentIntent intent = getIntent();
intent.putExtra("test", "test");// 设置该SelectActivity的结果码,并设置结束之后退回的ActivitySelectCityActivity.this.setResult(0, intent);// 结束TwoActivityTwoActivity.this.finish();

3.使用Bundle在Activity之间交换数据

Intent提供了多个重载的方法来“携带”额外的数据,如下:

intent.putExtras(Bundle data); // 向Intent放入数据包intent.putExtras(String name, Xxx value); // 向Intent中按key-value对的形式放入数据intent.getExtras(); // 取出Intent中携带的数据包intent.getXxxExtras(String name); //从Intent中按key取出指定类型的数据

上面方法中Bundle就是一个简单的数据携带包,Intent主要通过Bundle对象来携带数据,Bundle包含多个方法来存取数据:

Bundle bundle = new Bundle(); // 首先创建一个Bundle对象bundle.putXxx(String key, Xxx data); // 向Bundle中放入数据bundle.putSerializable(String key, Serializable data); // 向Bundle中放入一个可序列化的对象(即实现了java.io.Serializable接口)bundle.getXxx(String key); // 从Bundle中取出数据bundle.getSerializable(String key); // 从Bundle中取出一个可序列化的对象

4.Activity的四种加载模式

配置AndroidManifest.xml中Activity时,可指定android:launchMode属性用于配置该Activity的加载模式,该属性支持4个属性值:
standard:标准模式;
singleTop:栈顶单例模式;
singleTask:栈内单例模式(如果目标Activity已经存在、但没有位于栈顶,系统会把位于该Activity上面的所有Activity移出Task栈,从而使目标Activity转入栈顶);
singleInstance:全局单例模式(新创建Activity将放入新栈,一个栈只包含一个Activity,如果目标Activity已经存在,系统会把该Activity所在Task转到前台显示出来)。

5.Fragment的生命周期

Fragment是Androi D3.0引入的新API,Fragment代表Activity子模块(Activity片段),Fragment必须嵌入到Activity中使用,Fragment的生命周期受它所在Activity的生命周期的控制。

Fragment可调用getActivity()方法获取它所在Activity;
Activity可调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取Fragment;
在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态的添加、删除和替换Fragment。

1)我们先来看看各种Fragment基类的类图:

Fragment基类的类图

2)下面我们来看一下Fragment的生命周期,并和Activity的生命周期做对比:

Fragment的生命周期 Fragment对比Activity

6.Fragment的用法

1)创建Fragment

创建Fragment通常要实现如下三个方法:
onCreate()、onCreateView()、onPause()

为了控制Fragment显示的组件,通常需要重写onCreateView()方法,该方法返回的View将作为该Fragment显示的View组件。

// 重写该方法,该方法返回的View将作为Fragment显示的组件@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    // 加载/res/layout/目录下的fragment.xml布局文件
    View view = inflater.inflate(R.layout.fragment, container, false);
    TextView name = (TextView)view.findViewById(R.id.name));
    ...    return view;
}

2)将Fragment添加到Activity

将Fragment添加到Activity有如下两种方式:

第1种:在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name属性指定Fragment的实现类。

第2种:在Java代码中通过FragmentTransaction对象的add()方法来添加Fragment。
Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。

3)如何在Activity中动态的添加、更新、以及删除Fragment呢?

首先需要在MainActivity布局文件中添加FrameLayout(设置id为fl),然后简单创建一个两个Fragment(MyFragment和TwoFragment)如下:

public class MyFragment extends Fragment   {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment_my, container, false);  
    }  
}
public class TwoFragment extends Fragment   {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment_two, container, false);  
    }  
}

接下来就可以在MainActivity中动态的添加、更新、以及删除Fragment了,MainActivity中调用的方法如下:

// 设置默认的FragmentFragmentManager fm = getFragmentManager();  
FragmentTransaction transaction = fm.beginTransaction();  
myFragment = new MyFragment();  
transaction.replace(R.id.fl, myFragment);  
transaction.commit();

假设点击某按钮更新Fragment,该按钮点击事件如下:

@Override  public void onClick(View v) {  
    FragmentManager fm = getFragmentManager();  
    // 开启Fragment事务  
    FragmentTransaction transaction = fm.beginTransaction();  
    twoFragment = new TwoFragment();  
    // 使用当前Fragment的布局替代fl的控件  
    transaction.replace(R.id.fl, twoFragment);  
    // transaction.addToBackStack();  // 将事物添加到back栈,允许用户按BACK按键返回到替换Fragment之前的状态
    // 事务提交  
    transaction.commit();  
}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中

慕尼黑的夜晚无繁华

手记
粉丝
60
获赞与收藏
318

关注作者,订阅最新文章

相关文章推荐

  • android 开发:fragment 和 activity通信
  • Flutter-Android开发者文档 -Activity和Fragment
  • 【原创】Android中Activity和Fragment通信
  • 学习安卓开发[2] - 在Activity中托管Fragment
  • 让Fragment加载到Activity中——Android基础

阅读免费教程

  • Android 入门教程
    59个小节 43226 458
  • Android Studio 编辑器教程
    40个小节 11721 240
  • 后端通用面试教程
    41个小节 30163 339
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 分销返利 帮助中心 APP下载
官方微信
返回顶部

举报

0/150
提交
取消

玻璃钢生产厂家福州玻璃钢人物雕塑季节性商场美陈订购北京通道商场美陈现价深圳主题商场美陈供货商上海玻璃钢西瓜雕塑呼和浩特玻璃钢卡通雕塑长沙玻璃钢仿真雕塑玻璃钢动物雕塑喷泉淮北抽象玻璃钢雕塑订做价格全国商场美陈制作台州玻璃钢花盆金华动物玻璃钢雕塑市场广西主题公园玻璃钢雕塑大量销售丽水玻璃钢陶瓷雕塑企业大同玻璃钢卡通雕塑价格招远玻璃钢浮雕人物山水雕塑孝感小区玻璃钢雕塑定制玻璃钢人物雕塑联系电话很好的人物玻璃钢雕塑肇庆玻璃钢卡通公仔雕塑河南特色商场美陈哪里有贵州佛像玻璃钢雕塑销售电话商场珠宝区美陈方案山东景观玻璃钢雕塑销售电话松原市玻璃钢雕塑定制清镇玻璃钢雕塑生产厂家甘肃仿真玻璃钢雕塑制作长乐玻璃钢十二生肖雕塑玻璃钢雕塑特征海南商场美陈公司服务放心可靠香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化