首页 > Fragment切换的详细执行流程是怎样的?

Fragment切换的详细执行流程是怎样的?

我现在已经实现这样一个功能:RadioGroup+viewPager实现的切换式界面,现在我的每个Fragment都有定时界面刷新函数,我想知道
1、当fragmentA滑动到fragmentB具体执行了哪些重写的方法?
2、如果是通过底端radiobutton切换的又是怎样的执行顺序?

现在遇到的问题是fragmentA切换到fragmentB之后fragmentA的刷新函数还是在后台运行,我要怎么停掉!

还有一个问题:主界面是Mainactivity管理的几个Fragment的切换,当我跳转到另一个activity之后再返回到这个Mainactivity,我在Mainactivity里面写了以下代码来退出APP,可是只要是从MainActivity跳转到另外的Activity再返回来就很难一次性退出,要按很多次才能将APP推向后台,想要知道到底是为什么,要怎么改善,还请各位指教!

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && event.getRepeatCount() == 0) {
            this.exitApp();
        }
        return true;

    }
    return super.dispatchKeyEvent(event);
}

/** 退出程序 */
private void exitApp() {
    // 判断2次点击事件时间
    if ((System.currentTimeMillis() - exitTime) > 2000) {
        Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT)
                .show();
        exitTime = System.currentTimeMillis();
    } else {
        finish();
    }
}

fragment 切换有两种策略

1.使用replace,替换当前的fragment
2.使用add 和 hide 方法,要显示哪个就显示哪个,其他的则隐藏即可,这样相比于第一种在每次切换时不用每次都去加载一次数据,但是内存消耗上稍大

fragment+viewpager

会加载当前的fragment 和其相邻的Fragment为viewpager滑动做准备

RadioButton

只加载当前的Fragment

建议在选择切换策略时选择第二种


你的1,2问题你完全可以自己打Log实现查看,这样以后印象深刻,更有效果。
至于刷新的不知道你是怎么样的函数,最后一个其实只要在onKeyDown中判断,你把这段代码运用上去应该没什么问题了:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            //防止按一次退出
            if (System.currentTimeMillis() - mExitTime > 2000) {
                ToastUtils.showShort("再按一次回到桌面");
                mExitTime = System.currentTimeMillis();
            } else {
                finish();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

finish只是结束当前的activity,让你的所有activity都继承下面这个activity就能实现你想要的效果。当然还有其他方法就得靠你自己查了。

public class BaseActivity extends Activity {
    
    private long exitTime;
    
    BroadcastReceiver exitReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(ExitUtils.EXIT)) {
                finish();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter filter = new IntentFilter();
        filter.addAction(ExitUtils.EXIT);
        this.registerReceiver(exitReceiver, filter);
        exitTime = System.currentTimeMillis();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(exitReceiver);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                Intent exitIntent = new Intent();
                exitIntent.setAction(ExitUtils.EXIT);
                getApplicationContext().sendBroadcast(exitIntent);
            }
            return true;
        }

        return false;
    }
}
【热门文章】
【热门文章】