频繁切换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
- 频繁切换fragment报空的问题----fragment的切换-----再按一次退出程序
- Fragment切换的问题
- Fragment-Fragment切换的数据刷新问题
- Fragment之间的切换
- Fragment的切换
- 简单的Fragment切换
- 关于Fragment 的切换
- 两个fragment的切换
- Fragment页面的切换
- Fragment的切换方法
- Fragment切换的演示
- Fragment的切换
- Fragment的切换
- Fragment之间的切换
- android fragment的切换
- Fragment之间的切换
- fragment的切换
- Fragment之间的切换
- <<UNIX环境高级编程>>之第八章理解
- ubuntu下安装JDK
- Linux 下三种方式设置环境变量
- 主板知识详解:主板结构
- JavaCript日期
- 频繁切换fragment报空的问题----fragment的切换-----再按一次退出程序
- HDU2089不要62(数位DP入门)
- 关于数据库写入Emoji表情
- 蓝桥杯 算法训练 区间k大数查询(水)
- POJ3255次短路模板
- DevOps企业实践指南(1):DevOps能为我们带来什么
- 链表的基本操作
- configure intel C compiler / eclipse development environment
- 手机实现远程桌面控制