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