频繁切换fragment报空的问题----fragment的切换-----再按一次退出程序

来源:互联网 发布:unity3d模型资源百度云 编辑:程序博客网 时间:2024/06/05 17:30
频繁切换fragment时getActivity()会报空  还有长时间未进入app的时候fragment会报空

第一种方法:

在Fagment里加如下代码:

private Context context;    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        context = activity;    }    @Override    public void onDetach() {        super.onDetach();        context = null;    }
第二种方法:

在activity中添加如下代码:

 /**     * 避免fragment切换得时候用户长时间没有运行app,     * 导致fragment中getActivity()报空     */    @Override    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {//        super.onSaveInstanceState(outState, outPersistentState);    }
第三种方式:判断fragment是否为空

if (fragment==null){                        fragment = new HomeFragment();                    }
Android再按一次退出程序:
/**     * @return 当点击返回键的时候不要退出     * 执行再按一次退出程序     * 如果第二次按的时间和第一次按的时间在2s之内就退出程序     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (System.currentTimeMillis() - exittime < 2000) {                Log.i(TAG, "onKeyDown: " + "退出程序");                finish();                System.exit(0);            } else {                Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();                exittime = System.currentTimeMillis();            }        }        return false;    }
fragment的切换:首次加载fragment的时候replace,然后点击按钮的时候switchFragment,先判断一下fragment是否为空,如果为空的话新建一个。。

package com.ruru.fragment;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Toast;public class SecondActivity extends AppCompatActivity implements View.OnClickListener {    private Fragment top;    private Fragment fg_01, fg_02;    boolean f = false;    private long time;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        initView();        initPage();    }    private void initView() {        findViewById(R.id.btn_left).setOnClickListener(this);        findViewById(R.id.btn_right).setOnClickListener(this);    }    private void initPage() {        FragmentManager fm = getSupportFragmentManager();        FragmentTransaction transaction = fm.beginTransaction();        top = new Fragment01();        fg_01 = top;        transaction.replace(R.id.contentFrame, top);        transaction.commit();    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_left:                if (fg_01 == null) {                    fg_01 = new Fragment01();                }                switchFragment(fg_01);                f = true;                break;            case R.id.btn_right:                if (fg_02 == null) {                    fg_02 = new Fragment02();                }                switchFragment(fg_02);                f = true;                break;            default:                break;        }    }    private void switchFragment(Fragment to) {        if (top != to) {            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();            if (!to.isAdded()) { // 先判断是否被add过                transaction.hide(top).add(R.id.contentFrame, to).commit(); // 隐藏当前的fragment,add下一个到Activity中            } else {                transaction.hide(top).show(to).commit(); // 隐藏当前的fragment,显示下一个            }            top = to;        }    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (f) {                switchFragment(fg_01);                f = false;            } else {                if (System.currentTimeMillis() - time < 2000) {                    finish();                    System.exit(0);                } else {                    Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();                    time = System.currentTimeMillis();                }            }        }        return false;    }}

还有另外一种方法:tag的方法:

package com.ruru.fragment;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private FragmentManager fm;    private String tagLeft;    private String tagRight;    private String tagTop;    private FragmentTransaction transaction;    private Fragment01 fragment01;    private Fragment02 fragment02;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initPage();    }    private void initPage() {        tagLeft = "tagleft";        tagRight = "tagright";        fm = getSupportFragmentManager();        transaction = fm.beginTransaction();        Fragment01 fragment01 = new Fragment01();        transaction.add(R.id.contentFrame, fragment01, tagLeft);        tagTop = tagLeft;        transaction.commit();    }    private void initView() {        findViewById(R.id.btn_left).setOnClickListener(this);        findViewById(R.id.btn_right).setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_left:                switchFragment(tagLeft);                break;            case R.id.btn_right:                switchFragment(tagRight);                break;            default:                break;        }    }    private void switchFragment(String tag) {        FragmentTransaction transaction = fm.beginTransaction();        Fragment top = fm.findFragmentByTag(tagTop);        Fragment target = fm.findFragmentByTag(tag);        if (top != null) {            if (target == null) {                if (tag.equals(tagLeft)) {                    target = new Fragment01();                } else if (tag.equals(tagRight)) {                    target = new Fragment02();                }                transaction.hide(top);                transaction.add(R.id.contentFrame, target, tag);            } else {                transaction.hide(top);                transaction.show(target);            }            transaction.commit();            tagTop = tag;        } else {            fm = getSupportFragmentManager();            transaction = fm.beginTransaction();            Fragment01 fragment01 = new Fragment01();            transaction.add(R.id.contentFrame, fragment01, tagLeft);            tagTop = tagLeft;            transaction.commit();        }    }}







1 0
原创粉丝点击