今天在做fragment的时候,发现一个问题,当我的界面停留在fragment的时候,按物理返回键,这时候会推出整个应用。这当然不是我们期望的,我们期望按返回键以后,应用界面返回添加fragment之前的界面。后来就在网上查了相关的方法,发现有个关于入栈的概念,现在记录如下。

一下文章参考 http://blog.csdn.net/lmj623565791/article/details/37992017 这个博客感觉很厉害,写的东西很好

我们先看下没有做处理的时候,fragment按返回键的结果

作为实例,我们创建三个fragment,他们就是显示三个不同的字符串,就不一一列出了。

package com.example.test1123;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView; public class HistoryFragmentTwo extends Fragment {
private View mView;
private ListView mListView;
private Button mClearHistoryBtn;
private Button mBackCalculatorBtn; public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.notify_two, container, false);
if (mView != null) { return mView;
} else {
return super.onCreateView(inflater, container, savedInstanceState);
} } public interface HistoryClickListener {
void clickListen();
}
}

主代码如下

bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment()).commit();
}
});
bt2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo()).commit();
}
});
bt3.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
} });

在一个activity中加三个fragment,我们看下效果

我们发现,按下返回按钮以后,界面直接退出来了,下面我们进行下修改。

bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment())
.addToBackStack(null).commit();
}
});
bt2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo())
.addToBackStack(null).commit();
}
});
bt3.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
} });

这个里面其实增加了一个入栈操作

addToBackStack(null)

然后我们看下效果

从上面我们可以发现,addToBackStack(null) 这个方法,其实是把当前的一次操作入栈,给人的感觉是,把之前的界面记录下来,当我们按下反回键的时候,会把记录的界面重新调出来。

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】---(add fragment2 addToBackStack)【这时候fragment1界面就会如栈,在这个界面按返回键,会退回到fragment1,然后再按,回到main))

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】---(add fragment2)---(add fragment3)【这时候只有main界面在栈里,在这个界面按返回键,会调出main))

其实对这个问题理解的还是不清楚,随着知识点累积,以后再看吧

Fragment-按返回键程序退出的更多相关文章

  1. Fragment响应返回键

    Activty可以直接响应返回键,而Fragment却不行,可用如下方式: 创建一个抽象类BackHandledFragment,该类中有一个抽象方法onBackPress(),所有BackHandl ...

  2. vue 用huilder打包APP时,安卓按返回键就退出App改为按两次再退出App

    做vue项目时,用Hbuilder打包APP,在安卓下按返回键就是退出了APP,百度了下.都是使用到MUI来解决的,自己也记录下. 在main.js里面引入mui.js并使用. import mui ...

  3. 解决Hbuilder打包的apk文件按手机返回键直接退出软件

    问题描述:Hbuilder打包的app如果点击手机返回键,app会直接退出,返回不了上一页. 写在公共js文件中,每个页面均引入该js,代码如下: document.addEventListener( ...

  4. Android 应用按返回键异常退出的问题

    开发过程中遇到按返回键异常退出的问题,log显示为空指针异常,进一步产看是由于onActivityResult得到的Intent为空. 按返回键复写代码例如以下: @Override public v ...

  5. Unity响应Android的返回键,退出当前Activity

    一:使用 Application.Quit() public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit ...

  6. Android实现两次点击返回键提示退出

    Android的很多app中,都有点击一次返回键提示再次点击退出app的功能. 今天就看了下实现的方式,其实就是在相应的Activity中重写了onKeyDown()方法.在onKeyDown()方法 ...

  7. Android 两步搞定Fragment的返回键

    Fragment可以说是在Android开发必需要使用到技术,项目中的界面基本上都是使用Fragment来实现,而Activity只是作为Fragment的载体,但有些特殊情况下Fragment也不得 ...

  8. Back键和Menu键程序退出弹窗以及按钮退出程序弹窗的实现

    MainActivity.java package com.loaderman.backmenudemo; import android.content.Intent; import android. ...

  9. Android Studio 点击两次返回键,退出APP

    该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下: //第一次点击事件发生的时间 private long mExitTime; /** * 点击两次返回退出app ...

随机推荐

  1. Java 异常的捕获与处理详解(二)

    (一).throws关键字 throws关键字主要是在定义上使用的,表示的是此方法中不进行异常处理,而交给被调用处处理. 例如: class MyMath { public int div(int x ...

  2. 09-breack语句

  3. 数据库中Select For update语句的解析

    ----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...

  4. js使用offsetHeight获取div高度为0的问题

    今晚试了好久没弄出来,后来获取子一层的div就能获取到高度了 我的情况是这样的:我在最外面写一个<div id="mainBody">,  里面写bootstrap的d ...

  5. back_inserter 与 iterator

    查看这里: http://www.cplusplus.com/reference/iterator/back_inserter/ 是用来在最后插入的 注意,这个函数,是隐式特化了.

  6. 【C语言】打印1到最大的n位数

    //打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数. 比方:输入3.则打印出1.2一直到最大的3位数999 #include <stdio.h> #includ ...

  7. OpenCV图像处理篇之腐蚀与膨胀

    转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最主要的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算. ...

  8. Python数据可视化——散点图

    PS: 翻了翻草稿箱. 发现竟然存了一篇去年2月的文章...尽管naive.还是发出来吧... 本文记录了python中的数据可视化--散点图scatter, 令x作为数据(50个点,每一个30维), ...

  9. 存储过程和transaction

    https://stackoverflow.com/questions/11531352/how-to-rollback-a-transaction-in-a-stored-procedure BEG ...

  10. 团队作业——团队项目Alpha版本发布

    该作业所属课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求链接    https://edu.cnblogs. ...