前言
最近在学习使用 React Native开发,iOS搞完,开始适配安卓,由于木有接触过安卓,所以碰到了很多问题,第一个问题,安卓的返回键BackAndroid问题,
我写了一个工具类,来搞定,其中用到了java原生代码与js交互;好吧,下面开始正式内容:
上代码:
// BackAndroidTool // 功能: "安卓手机上的返回键" // Created by 小广 on 2016-05-10 下午. // Copyright © 2016年 All rights reserved. /* 使用: 参考链接:http://reactnative.cn/post/480 1.在首页/homepage页(只需要在全局都存在的页面调用一次监听即可) componentDidMount(){ // 添加返回键监听 BackAndroidTool.addBackAndroidListener(this.props.navigator); } componentWillUnmount(){ // 移除返回键监听 BackAndroidTool.removeBackAndroidListener(); } 说明:BackAndroid在iOS平台下是一个空实现, 所以理论上不做这个Platform.OS === 'android'判断也是安全的。 2. 某些类自定义返回键操作(即点击返回键弹出一个alert之类的操作) 在所需类的初始化方法里调用BackAndroidTool.customHandleBack 栗子: constructor(props) { super(props); BackAndroidTool.customHandleBack(this.props.navigator,() => { Alert.alert('提示','您还未保存记录,确定要返回么?', [{text:'取消',onPress:() => {}}, {text:'确定',onPress:() => { this.props.navigator.pop(); }} ]); // 一定要 return true; 原因上面的参考链接里有 return true; }); } 3.某些页面需要禁用返回键 在nav进行push的时候,设置属性ignoreBack为true 即可 this.props.navigator.push({ component: 所需要禁用的类, ignoreBack:true, }); */ 'use strict'; import React,{ Platform, Navigator, BackAndroid, ToastAndroid, NativeModules, } from 'react-native'; // 类 var NativeCommonTools = NativeModules.CommonTools; export default { // 监听返回键事件 addBackAndroidListener(navigator) { if (Platform.OS === 'android') { BackAndroid.addEventListener('hardwareBackPress',() => { return this.onBackAndroid(navigator); }); } }, // 移除监听 removeBackAndroidListener() { if (Platform.OS === 'android') { BackAndroid.removeEventListener('hardwareBackPress', () => { }); } }, // 判断是返回上一页还是退出程序 onBackAndroid(navigator) { if (!navigator) return false; const routers = navigator.getCurrentRoutes(); // 当前页面不为root页面时的处理 if (routers.length > 1) { const top = routers[routers.length - 1]; if (top.ignoreBack || top.component.ignoreBack) { // 路由或组件上决定这个界面忽略back键 return true; } const handleBack = top.handleBack || top.component.handleBack; if (handleBack) { // 路由或组件上决定这个界面自行处理back键 return handleBack(); } // 默认行为: 退出当前界面。 navigator.pop(); return true; } // 当前页面为root页面时的处理 if (this.lastBackPressed && (this.lastBackPressed + 2000 >= Date.now())) { //最近2秒内按过back键,可以退出应用。 NativeCommonTools.onBackPressed(); return true; } this.lastBackPressed = Date.now(); ToastAndroid.show('再按一次退出应用',ToastAndroid.SHORT); return true; }, // 自定义返回按钮事件 customHandleBack(navigator, handleBack) { if (navigator) { let routes = navigator.getCurrentRoutes(); //nav是导航器对象 let lastRoute = routes[routes.length - 1]; // 当前页面对应的route对象 lastRoute.handleBack = handleBack; } }, }
其中的java原生代码如下:
管理类:RCTCommonToolsPackage (ps:如是不明白,可以去这里 React Native学习:http://reactnative.cn/docs/0.25/native-modules-android.html#content);
package com.commonTools; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Arrays; import java.util.Collections; import java.util.List; public class RCTCommonToolsPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { return Arrays.<NativeModule>asList(new RCTCommonTools(reactContext)); } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
自定义方法的类:RCTCommonTools
package com.commonTools; import android.content.Intent; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.tcpaydls.BuildConfig; public class RCTCommonTools extends ReactContextBaseJavaModule { public RCTCommonTools(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "RCTCommonTools"; } /** * 此方法是为了解决返回键退出程序后,ToastAndroid不会消失的bug */ @ReactMethod public void onBackPressed() { Intent setIntent = new Intent(Intent.ACTION_MAIN); setIntent.addCategory(Intent.CATEGORY_HOME); setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getCurrentActivity().startActivity(setIntent); } }
总结
以上就是这篇文章的全部内容了,本文还有许多不足,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
本文向大家介绍Android学习笔记之ContentProvider和Uri详解,包括了Android学习笔记之ContentProvider和Uri详解的使用技巧和注意事项,需要的朋友参考一下 本文介绍了自定义Content Provider的相关内容,完全解析内容提供者的用法。Content Provider,内容提供者,相信大家对这个组件的名字都不陌生,可能是自己平时做的都是一些简单的App
本文向大家介绍vuex学习之Actions的用法详解,包括了vuex学习之Actions的用法详解的使用技巧和注意事项,需要的朋友参考一下 Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 是异步的,mutation是同步的。 沿用vuex学习---简介的案例:这里是加10 减1 1.在store.js 中 代码为:
本文向大家介绍PHP进阶学习之垃圾回收机制详解,包括了PHP进阶学习之垃圾回收机制详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP垃圾回收机制。分享给大家供大家参考,具体如下: 一、概念 垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。在现在的流行各种语言当中,垃圾回
本文向大家介绍Vue.js学习之过滤器详解,包括了Vue.js学习之过滤器详解的使用技巧和注意事项,需要的朋友参考一下 前言 在这个教程中,我们将会通过几个例子,了解和学习VueJs的过滤器。阅读这这篇文中的前提是你对Vue已经有了基本的语法基础。 Vue.Js中的过滤器基础 过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。Vue有很多很便利的过滤器,可以参考官方文档
问题内容: 我应该在学习Android之前先学习Java还是可以同时做两件事?最好的方法是什么? 问题答案: 我绝对会首先学习Java。不要费心学习诸如servlet,Swing等之类的东西-但要学习: 核心语言 馆藏 IO 字符串处理 尝试在学习这些知识的同时 还 学习一个全新的环境,将使找出问题所在变得更加困难。 请注意,这不是特定于Android的-我总是鼓励开发人员在学习“外围”技术(例如
本文向大家介绍Android 逆向学习详解及实例,包括了Android 逆向学习详解及实例的使用技巧和注意事项,需要的朋友参考一下 断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的。当然要深入的话还需要对这门语言的细节特性和奇技淫巧进行挖掘。 这里推荐2本书,个人觉得对