Android中Activity和Fragment页面跳转

来源:互联网 发布:开票软件怎么重装 编辑:程序博客网 时间:2024/04/30 02:11

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