Android中Activity和Fragment页面跳转

这几天看了一个项目源码,他们的页面跳转很少使用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();
        }   
    
  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值