这几天看了一个项目源码,他们的页面跳转很少使用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();
}