这几天看了一个项目源码,他们的页面跳转很少使用Activity,而是使用fragment,所以这几天准备整理一下fragment和activity的页面跳转问题。
在我看来页面跳转分为activity之间的跳转和activity和fragment之间跳转。下面我就来说一一说明一下。
一、Activity之间的页面跳转,还可以细分为:
普通的Activity跳转
带参数的Activity之间的跳转
关闭当前Activity时,传递参数到前一个Activity的页面跳转
详情:
普通的Activity跳转,需要使用系统提供的startActivity(Intent intent)打开页面跳转的意图
Intent intent = new Intent(MainActivity.this,OtherActivity.class); startActivity(intent);
带参数的Activity之间的跳转,需要使用意图Intent中的putExtra(String str,A)方法,然后再新的Activity中通过getIntent()获取意图,然后再通过适应的get方法获取传递过来的数据。
Intent intent = new Intent(MainActivity.this,OtherActivity.class); intent.putExtra("MainActivity", "message"); startActivity(intent);
然后再新的Activity中:
String str = getIntent().getExtras().getString("MainActivity");
关闭Activity时,传递参数到前一个Activity的页面跳转
这里需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,想要在新的Activity页面关闭时,将数据传递给上一个Activity需要在上一个Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
例子1:在MainActivity中,有两个按钮,都能打开OtherActivity,然后再关闭OtherActivity时,都会调用MainActivity中的onActivityResult(int requestCode, int resultCode, Intent data)方法,怎么能知道是哪个按钮打开的呢,并且做出相应的处理。
public class MainActivity extends Activity { public Button btnA, btnB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnA = (Button) findViewById(R.id.btnA); btnB = (Button) findViewById(R.id.btnB); btnA.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 0); } }); btnB.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 0: // btnA按钮的的请求返回 break; case 1: // btnB按钮的请求返回 break; default: break; } } }
例子2:在MainActivity中的startActivityForResult(Intent intent,int resultCode)可以打开不同的界面,当关闭这些新打开界面时候,都会调用前面界面中的onActivityResult(int requestCode, int resultCode, Intent data)方法,怎么能知道是关闭哪个界面时候调用的呢,并且做出相应的处理,这需要关闭的Activity传递回的标识
public class MainActivity extends Activity { public Button btnA, btnB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnA = (Button) findViewById(R.id.btnA); btnA.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case 00: // OtherActivity界面关闭时的调用的方法 String messge = data.getExtras().getString("OtherActivity"); break; default: break; } } }
OtherActvity
public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); Intent intent = new Intent(); intent.putExtra("OtherActivity", "message"); setResult(00, intent); } }
二、Activity与fragment之间的页面跳转:
fragment出现的原因是因为开发app时无法同时适用手机与平板,而fragment的出现就是解决这个问题的。你可以将fragment当成activity的组成部分,它有自己的生命周期和接收和处理事件的方法,这样就不需要在activity中写一堆控件的事件处理方法了。
在一个继承FragmentActivity的activity中
- fragment跳转到activity界面
- activity中的framlayout替换fragment
详情
fragment跳转到activity界面
直接使用系统提供的startActivity(Intent intent)来实现跳转
activity中的framlayout替换fragment
/** * 使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace . add 和 replace * 影响的只是界面,而控制回退的,是事务 add 是把一个fragment添加到一个容器 container 里 replace * 是先remove掉相同id的所有fragment,然后在add当前的这个fragment * 在大部分情况下,这两个的表现基本相同。因为,一般,咱们会使用一个FrameLayout来当容器,而每个Fragment被add 或者 * replace 到这个FrameLayout的时候,都是显示在最上层的。所以你看到的界面都是一样的。但是, * 使用add的情况下,这个FrameLayout其实有2层,多层肯定要比一层的来得浪费,所以还是推荐使用replace。 * 当然有时候还是需要使用add的 * 。比如要实现轮播图的效果,每个轮播图都是一个独立的Fragment,而他的容器FrameLayout需要add多个Fragment * ,这样他就可以根据提供的逻辑进行轮播了 */ public void addFragment(Fragment ft) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ftraTransaction = fm.beginTransaction(); ftraTransaction.addToBackStack(null); ftraTransaction.add(R.id.fl, ft); ftraTransaction.commit(); } public void replaceFragment(Fragment ft) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction beginTransaction = fm.beginTransaction(); beginTransaction.replace(R.id.fl, ft); beginTransaction.commit(); }