当前位置:   article > 正文

Android开发实践 巧用Activity和Fragment_怎么让activity和fragment最佳写法

怎么让activity和fragment最佳写法

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/51452313

1.Activity的生命周期

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

Activity基类的类图

当Activity类定义出来之后,这个Activity何时被实例化、它所包含的方法何时被调用,这些都不是由开发者所决定的,都应该由Android系统来决定。
下面我们来看一下Activity的生命周期:

Activity的生命周期

2.Activity的用法

1)启动、关闭Activity

  1. // 首先需要创建启动的Activity对应的Intent
  2. Intent intent = new Intent(MainActivity.this, TwoActivity.class);
  3. // 启动Activity
  4. startActivity(Intent intent);
  5. startActivityForResult(Intent intent, int requestCode); // requestCode:请求码
  6. //startActivityForResult方法以指定的请求码启动Activity,并通过重写onActivityResult方法获取返回的结果。
  7. // 关闭Activity
  8. finish();
  9. finishActivity(int requestCode);
  10. // finishActivity方法结束以startActivityForResult方法启动的Activity。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

实例:
在当前Activity中重写onActivityResult方法

  1. public class MainActivity extends Activity {
  2. Button bn;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. // 获取界面上的组件
  8. ...
  9. // 绑定事件监听器
  10. bn.setOnClickListener(new OnClickListener() {
  11. @Override
  12. public void onClick(View view) {
  13. Intent intent = new Intent(MainActivity.this, TwoActivity.class);
  14. startActivityForResult(intent, 0); // 0是请求码,用于标识该请求
  15. }
  16. });
  17. }
  18. @Override
  19. public void onActivityResult(int requestCode, int resultCode, Intent intent) {
  20. // 处理特定的结果
  21. if (requestCode == 0 && resultCode == 0) {
  22. // 取出Intent里的Extras数据
  23. Bundle data = intent.getExtras();
  24. // 取出Bundle中的数据
  25. String result = data.getString("test");
  26. Toast.makeText(getApplicationContext(), result, 0).show();
  27. }
  28. }
  29. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

  1. // 获取启动该Activity之前的Activity对应的Intent
  2. Intent intent = getIntent();
  3. intent.putExtra("test", "test");
  4. // 设置该SelectActivity的结果码,并设置结束之后退回的Activity
  5. SelectCityActivity.this.setResult(0, intent);
  6. // 结束TwoActivity
  7. TwoActivity.this.finish();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

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

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

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是Android3.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组件。

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

2)将Fragment添加到Activity

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

  1. 1种:在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name属性指定Fragment的实现类。
  2. 2种:在Java代码中通过FragmentTransaction对象的add()方法来添加Fragment。
  3. Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

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

  1. // 设置默认的Fragment
  2. FragmentManager fm = getFragmentManager();
  3. FragmentTransaction transaction = fm.beginTransaction();
  4. myFragment = new MyFragment();
  5. transaction.replace(R.id.fl, myFragment);
  6. transaction.commit();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

  1. @Override
  2. public void onClick(View v) {
  3. FragmentManager fm = getFragmentManager();
  4. // 开启Fragment事务
  5. FragmentTransaction transaction = fm.beginTransaction();
  6. twoFragment = new TwoFragment();
  7. // 使用当前Fragment的布局替代fl的控件
  8. transaction.replace(R.id.fl, twoFragment);
  9. // transaction.addToBackStack(); // 将事物添加到back栈,允许用户按BACK按键返回到替换Fragment之前的状态
  10. // 事务提交
  11. transaction.commit();
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/178075
推荐阅读
相关标签
  

闽ICP备14008679号