Fragment进阶(五)----->监听fragment回退事件
activity_main.xml
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <Button
android:id="@+id/btn_add_frg3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add frag3" /> <FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
fragment3.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000ff"
android:orientation="vertical"> <TextView
android:id="@+id/fragment3_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="这是Fragment 3" /> </LinearLayout>
MainActivity
package com.harvic.fragmentback; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;
import android.widget.Scroller; /**
* 既然清楚了Fragment仅仅是一个控件,而回退事件也仅仅能在Activity中拦截。那我们就能够想办法了。
* 首先,我们能够在Fragment类中咱们自己写一个onBackPressed()方法来处理回调事件。
* 然后。能够利用回调。将要处理回退事件的fragment实例。传给Activity。
* 最后,在拿到fragment实例以后,就能够在Activity的onBackPress
* ()方法中。调用这个fragment实例的onBackPressed()方法了。 这样。我们就在fragment中拦截了回退事件了。 *
*/ public class MainActivity extends FragmentActivity implements
View.OnClickListener, Fragment3.BackHandlerInterface {
private Fragment3 selectedFragment; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnAddFrag3 = (Button) findViewById(R.id.btn_add_frg3);
btnAddFrag3.setOnClickListener(this);
} @Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_add_frg3: {
Fragment3 fragment3 = new Fragment3();
addFragment(fragment3, "fragment3");
}
break;
} } private void addFragment(Fragment fragment, String tag) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragment_container, fragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
} /**
* 在activity中获取fragment页面
*/
@Override
public void setSelectedFragment(Fragment3 backHandledFragment) {
this.selectedFragment = backHandledFragment;
} /**
* !selectedFragment.onFragmentBackPressed()返回true(non-Javadoc)
* selectedFragment.onFragmentBackPressed()返回false; 让activity来处理就可以
*/ @Override
public void onBackPressed() {
if (!selectedFragment.onFragmentBackPressed()) {
// 回退
super.onBackPressed();
}
} }
Fragment3
package com.harvic.fragmentback; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; public class Fragment3 extends Fragment {
private boolean mHandledPress = false; protected BackHandlerInterface backHandlerInterface;
public interface BackHandlerInterface {
public void setSelectedFragment(Fragment3 backHandledFragment);
} TextView tv; /**
* 事实上在onAttach()回调时就已经把Fragment与Activity绑定在了一起,所以仅仅要生命流程在onAttach()
* 之后的随意一个生命周期
* ,我们都能够通过getActivity来获取Activity的实例,来进行强制转换,所以在这里我们就换个地方,在onCreate()函数中来做:
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!(getActivity() instanceof BackHandlerInterface)) {
throw new ClassCastException(
"Hosting activity must implement BackHandlerInterface");
} else {
// 强转为接口实例
backHandlerInterface = (BackHandlerInterface) getActivity();
}
} /**
* onCreateView返回一个fragment视图
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment3, container, false);
} /**
* 有关这个设置Fragment3实例的代码,仅仅要在生命周期中Fragment3实例已经产生了都能够设置,即能够放在生命周期在onCreate()
* 后的函数里,即onCreate()、onCreateView()、onActivityCreated()、onStart()。尽管经过我測试。
* 放在这几个函数中的随意一个都是可行的
* ,但onActivityCreated()后才是Activity终于onCreate()运行完。所以放在onActivityCreated
* ()或onStart()中是最保险的。所以这里放在了onStart()中来处理
*/ @Override
public void onStart() {
super.onStart();
backHandlerInterface.setSelectedFragment(this);
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
tv = (TextView) getView().findViewById(R.id.fragment3_tv);
} /**
* 其返回一个布尔值;意思是,假设对返回事件进行了处理就返回TRUE,假设不做处理就返回FALSE,让上层进行处理。
*
* @return
*/
public boolean onFragmentBackPressed() {
if (!mHandledPress) {
tv.setText("Fragment3 \n 捕捉到了回退事件哦! ");
mHandledPress = true;
return true;
}
return false;
}
}
Fragment进阶(五)----->监听fragment回退事件的更多相关文章
- iOS微信浏览器回退不刷新(监听浏览器回退事件)
兼容性:兼容全部ios系统 $(function(){ pushHistory(); }); function pushHistory(){ window.addEventListener(" ...
- Fragment-如何监听fragment中的回退事件与怎样保存fragment状态
一.如何监听Fragment中的回退事件 1.问题阐述 在Activity中监听回退事件是件非常容易的事,因为直接重写onBackPressed()函数就好了,但当大家想要监听Fragment中的回退 ...
- Android中Button的五种监听事件
简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...
- js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写
js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写 一.总结 一句话总结:滚动事件scroll(),浏览器窗口调整监听resize(),思考好监听对象. 1.滚动事件scroll()的监听对象是 ...
- 从零开始学习Node.js例子五 服务器监听
httpsnifferInvoke.js var http = require('http'); var sniffer = require('./httpsniffer'); var server ...
- 三种方式监听NGUI的事件方法
NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定 ...
- IOS之UI--自定义按钮实现代理监听点击事件
前言: Objective-C提供的按钮监听事件的方法是 不含参数的监听方法 [button实例对象 addTarget:self action:@selector(func) forControlE ...
- Android监听点击事件实现的三种方法
监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...
- javascript 原生方法监听DOM结构改变事件
js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...
- WPF之监听组合键事件
private void KeyDown(object sender, KeyEventArgs e) { if (e.Key== Key.Up && Keyboard.Modifie ...
随机推荐
- 使用VS Code调试Flutter(检查用户页面)
官方提供的是Flutter Widget Inspector,详见https://flutterchina.club/inspector/ 我用的是另外一种好用的调试工具 Dart DevTools ...
- 华硕笔记本无法设置U盘启动,快捷启动不能识别
最近有不少华硕笔记本用户朋友在使用U大侠装系统时,不管是使用快捷键启动还是BIOS查看,都没有发现U盘启动项,这该怎么办呢? 不要急,既然找不到启动项,那就从设置启动项来解决不就可以了. 第一种方 ...
- 面试之Spring
一.IoC IoC(Inversion of Control):控制反转(是把传统上由程序代码直接操控的对象的生成交给了容器来实现, 通过容器来实现对象组件的装配和管理.所谓"控制反转&qu ...
- 聚类和EM算法——K均值聚类
python大战机器学习——聚类和EM算法 注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子 ...
- 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.0隆重发布
v3.3.0 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国 itest项目地址 https://www.oschina. ...
- jq进度条
<!doctype html><html><head><meta charset="utf-8"><title>JQue ...
- glibc库函数,系统调用API
glibc封装了大部分系统API,我们一般都是使用glibc封装的接口进行系统调用,碰到一些没有封装的接口,可以通过这个 函数syscall 进行系统调用. /* Invoke `system c ...
- 根据Dockerfile创建hello docker镜像
一.编写hello可执行c文件: 1.安装:gcc glibc glibc-static yum install -y gcc glibc glibc-static 2.编写hello.c:vim h ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- python TCP协议与UDP协议
1. TCP协议 / UDP协议 1.1 TCP协议 1.可靠.慢.全双工通信 2.建立连接的时候 : 三次握手 3.断开连接的时候 : 四次挥手 4.在建立起连接之后 发送的每一条信息都有回执 为了 ...