android Fragments详解六:处理fragement的生命周期

简介:

把条目添加到动作栏

你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptionManu()来完成。

你从fragment添加到菜单的任何条目,都会出现在现有菜单项之后。Fragment之后可以通过方法onOptionsItemSelected()来响应自己的菜单项被选择的事件。

你也可以在fragemnt中注册一个view来提供快捷菜单(上下文菜单)。当用户要打开快捷菜单时,fragment的onCreateContextMenu()方法会被调用。当用户选择其中一项时,fragemnt的onContextItemSelected()方法会被调用。

注:尽管你的fragment可以分别收到它所添加的菜单项的选中事件,但是activity才是第一个接收这些事件的家伙,只有当activity对某个事件置之不理时,fragment才能接收到这个事件,对于菜单和快捷菜单都是这样。

 

处理fragement的生命周期

 

管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三种状态:

Resumed:

Fragment在一个运行中的activity中并且可见。

Paused:

另一个activity处于最顶层,但是fragment所在的activity并没有被完全覆盖(顶层的activity是半透明的或不占据整个屏幕)。

Stoped:

Fragment不可见。可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了。此状态的fragment仍然存在于内存中。

同样类似于activity,你可以把fragment的状态保存在一个Bundle中,在activity被recreated时就需用到这个东西。你可以在onSaveInstanceState()方法中保存状态并在onCreate()或onCreateView()或onActivityCreated()中恢复,关于更多的保存状态的信息,请参考Activitys章节。

Fragment与Activity的生命周期中最大的不同就是存储到后退栈中的过程。Activity是在停止时自动被系统压入停止栈,并且这个栈是被系统管理的;而fragment是被压入activity所管理的一个后退栈,并且只有你在删除fragment后并明确调用addToBackStack()方法时才被压入。

然而,管理fragment的生命周期与管理activity的生命周期极其相似。你所需要去思考的是activity的生命周期如何影响fragment的生命周期。

 

协调与activity生命周期的关系

 

Activity直接影响它所包含的fragment的生命周期,所以对activity的某个生命周期方法的调用也会产生对fragment相同方法的调用。例如:当activity的onPause()方法被调用时,它所包含的所有的fragment们的onPause()方法都会被调用。

Fragment比activity还要多出几个生命周期回调方法,这些额外的方法是为了与activity的交互而设立,如下:

onAttach()

当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。

onCreateView()

当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。

onActivityCreated()

当activity的onCreated()方法返回后调用此方法。

onDestroyView()

当fragment的layout被销毁时被调用。

onDetach()

当fragment被从activity中删掉时被调用。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。

 

复制代码
Android之基本常见知识(持续更新)

//能够取得屏幕的信息 
DisplayMetrics dm = new DisplayMetrics(); 

    getWindowManager().getDefaultDisplay().getMetrics(dm);
dm.widthPixels;                //取得宽像素
    dm.heightPixels;       //取得高像素

 

//获取当地的日历 

Calendar c=Calendar.getInstance();
    mYear=c.get(Calendar.YEAR);//获取年份
    mMonth=c.get(Calendar.MONTH);//获取月份
 mDay=c.get(Calendar.DAY_OF_MONTH);//获取号数
    mHour=c.get(Calendar.HOUR_OF_DAY);//获取小时
    mMinute=c.get(Calendar.MINUTE); //获取分钟

 

//把EditText的内容设为可视或隐藏

/* 设定EditText的内容为可见的 */

     editText.setTransformationMethod(

     HideReturnsTransformationMethod.getInstance());

 

     /* 设定EditText的内容为隐藏的 */

     editText.setTransformationMethod(

     PasswordTransformationMethod.getInstance()); 
 

//启动activity时不自动弹出软键盘
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);  

 

//设置全屏(在setContentView之前设置)
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
//设置取消全屏

WindowManager.LayoutParams attrs = getWindow().getAttributes();  

attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attrs); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

 

//设置无标题(在setContentView之前设置)
        requestWindowFeature(Window.FEATURE_NO_TITLE); 

 

//设置禁止手机横屏(在setContentView之前设置)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

 

//调用手机默认的摄像功能,而且可以设定储存位置

Intent i = new Intent("android.media.action.IMAGE_CAPTURE");  

i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment .getExternalStorageDirectory(),"pic.jpg")));

 

//解决中文乱码方法 

A. 使用getBytes("") 来对汉字进行重编码,得到它的字节数组

B. 再使用new String(Bytes[] , "解码方式")  来对字节数组进行相应的解码

 

//在Android中轻松实现横竖屏的布局 

竖屏的布局一般在layout下面设置;横屏的布局则在layout的同等级文件夹创建名字layout-land的文件夹。模拟器可以使用Ctrl+F11进行快速切换。 

 

//Android横竖屏切换不重启Activity

androidmanifest.xml中的activit元素加入这个属性android:configChanges="orientation|keyboardHidden" 

然后在Activity中重载以下方法:

复制代码
          public void onConfigurationChanged(Configuration newConfig) {
     // TODO Auto-generated method stub
  if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.imageswitch);
            //横屏
        } else {
            setContentView(R.layout.editcontact);//竖屏
        }
         super.onConfigurationChanged(newConfig);

}   

复制代码
    
卸载程序:

Uri packageURI = Uri.parse("package:com.demo.CanavaCancel");   

Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
startActivity(uninstallIntent);

安装apk:

String str = "/CanavaCancel.apk";
String fileName = Environment.getExternalStorageDirectory() + str;
Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);
 
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4916739.html,如需转载请自行联系原作者


相关文章
|
1月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
54 2
|
9月前
|
Android开发
Android一些特殊情况下的生命周期分析
Android一些特殊情况下的生命周期分析
49 0
|
1月前
|
Android开发
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
61 0
|
10月前
|
Android开发
Android 中Activity和Fragment生命周期的具体变化详解
Android 中Activity和Fragment生命周期的具体变化详解
118 0
|
10月前
|
Android开发
Android 屏幕发生旋转对应的生命周期发生变化解析
Android 屏幕发生旋转对应的生命周期发生变化解析
140 0
|
10月前
|
XML Android开发 数据格式
Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)
Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)
66 0
|
11月前
|
Android开发
Android中下拉通知栏,Activity会走哪些生命周期?
我们就可以做一个总结:当前Activity中,下拉通知栏,是不走任何生命周期的。
170 0
|
Android开发
Android常见类及生命周期
Bundle是一种打包数据的类,本质上是键值对 Intent是一个跳转页面的类 Context是上下文类
48 0
|
Java Android开发
❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️
Activity组件是Android的用户接口程序,它充当了Android应用程序与用户的交互入口。
172 0
❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️
|
安全 测试技术 API
Android | Compose 生命周期和附带效应
Android | Compose 生命周期和附带效应
Android | Compose 生命周期和附带效应