1. 程式人生 > >React Native學習安卓手機上的返回鍵BackAndroid

React Native學習安卓手機上的返回鍵BackAndroid

使用 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原生程式碼如下:
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);
    
  }
}


相關推薦

React Native學習手機返回BackAndroid

使用 React Native開發,iOS搞完,開始適配安卓,由於木有接觸過安卓,所以碰到了很多問題,第一個問題,安卓的返回鍵BackAndroid問題,我寫了一個工具類,來搞定,其中用到了java原

H5中 JS 禁用手機物理返回 , 微信瀏覽器中也支援

直接引入以下程式碼就可以實現 XBack = {}; (function(XBack) { XBack.STATE = 'x - back'; XBack.element; XBa

Unity3D 怎樣在手機播放視頻

nbsp screen mp4 unity3 clas 電腦 () div oid 曾經僅僅會在電腦上通過Unity3D播放視頻,研究了下發現通過Unity3D在手機上播放視頻也很easy。現介紹例如以下。 void OnGUI() { if

解決手機軟鍵盤彈出擠壓背景的問題

彈出 鍵盤 color col 軟鍵盤 func class div res demo: // 解決本頁面軟鍵盤彈窗背景擠壓的問題 var clientHeight = document.documentElement.clientHeight || documen

轉載一篇文章 python程序在手機使用

cto line str socket code -s sele led data from kivy.app import App from kivy.uix.button import Button class TestApp(App): def build(

手機有什麼好用的日程安排管理軟體?

安卓手機上有什麼簡單好用的日程安排管理軟體? 在百度知道上有一個於此相關的問題,題主的要求十分明確,在這篇文章中,小編不妨以圖中的問題為基準,為大家介紹一款簡單好用的手機日程安排管理軟體。 1.分類管理待辦任務的日程管理軟體 敬業籤雲便籤是一款專為商務辦公族設計的桌面提醒便

手機免費使用的CAD看圖軟體推薦!

安卓手機上免費使用的CAD看圖軟體推薦!在我們需要在手機上開啟一張CAD圖紙檔案的時候,你會不會因為打不開圖紙而煩惱呢?還有就是圖紙開啟速度過慢時間太長而焦躁呢?不過現在不需要進行擔心了,今天小編就要來給大家安利一款在手機上進行CAD圖紙檔案開啟的軟體了,圖紙開啟時間迅速且使用方便操作簡單,小面小編就來教大家

微信網頁開發wx.getLocation在手機的一個坑

    我在wx.getLocation的成功回撥函式裡,執行了一句 this.lon = res.longitude.toFixed(6)     在蘋果手機和除錯工具上都是能獲取到資料的,但是在安卓手機上this.lon沒有獲取到資料,排查之後,發

小程式 - wx.pageScrollTo手機滾動異常

官方文件 wx.pageScrollTo(Object object) 該效果在微信開發者工具的模擬器,蘋果手機上都正常滾動;但是在安卓手機上看不到正常的滾動效果,我見到過的bug有 從當前位置,滾動到最頂部,再滾動到指定位置 滾動到指定距離的偏差大 如果

vue2.0專案中使用CSS3 animation動畫在手機失效解決辦法

vue2.0 + webpack做移動端專案,如果在專案中使用了CSS3 animation動畫屬性,會發現在ios上完全沒問題,但是在安卓手機上依然失效,儘管把animation在五大瀏覽器各種相容都

解決手機傳圖片沒有拍照選項,修改後又出現的手機能載入相簿和攝像頭但蘋果手機不能載入相簿的問題

<input type="file" id="choose" accept="image/*" multiple> 上面是原始碼,下面修改後可以讓安卓手機顯示攝像頭 <inp

React-Native原生的混合開發

寫在前面 目前很多大廠APP(如淘寶、餓了麼、美團等等)並不是純原生Android&IOS,也不是純JS開發,而是Hybird APP開發,混合型優勢很多:比如熱更新,保證在一些類似雙十一的活動到來時能夠快速上線活動頁面,使用者不必再去更新APP。再來有效地減小了安裝包的體積

react-native-echarts 版打包後,圖表不顯示

1、相容手機端 <meta name="viewport" content="width=device-width, initial-scale=1"> 2、解決android打包後不顯示 複製檔案tpl.html(路徑: node_mod

React-native windows 打包

1.注意:生成簽名金鑰過程中不要用中文 官網連結: http://reactnative.cn/docs/0.44/signed-apk-android.html#content 2.生成一個簽名金

react native學習筆記13——FlatList拉載入

我們可以利用官方元件RefreshControl實現下拉重新整理功能,但React Native官方沒有提供相應的上拉載入的元件,因此在RN中實現上拉載入比下拉重新整理要複雜一點。 雖然沒有直接提供上拉載入的元件,不過我們仍可以通過FlatList的onEnd

Unity實現在手機觸屏控制轉向--控制物件為飛機

該例項是Unity實現在移動端通過觸控式螢幕幕進行對飛機的移動和轉向,用於學習Touch類的相關知識public class AirControl:MonoBehaviour{ private Transform m_transform; //飛機

使用springmvc 接收傳圖片,在 手機 ios ,有圖片傳就不報錯, 沒有就報下面這個錯誤,然後在pc端跟手機就不會有這個錯誤,這是為什麼呢?

七月 18, 2018 4:04:22 下午 org.apache.catalina.core.StandardWrapperValve invoke 嚴重: Servlet.service() for servlet [springMVC] in context with

解決cocos2dx CCArmature動畫在部分型號的手機播放不正常的問題

cocos2dx其實是有很多的坑,等待我們去挖掘,所以精通框架,精通opengl es是很重要的。 最近,在我做android機測試時,發現公司裡的一款三星手機的骨骼動畫顯示不全,且有的圖片會有閃爍。 一時找不到辦法,各路救助後在cocoachina上找到了解決辦法: 將C

為什麼手機的多數APP,訊息推送不了?

有人問: 蘋果手機上的APP,只要設定好了,訊息推送就沒有一點問題; 而安卓手機上,為什麼只有一部分APP(如微信等),能正常推送;而其它的APP,怎麼設定也沒有及時訊息推送? 個人的分析理解如下,說得不對的地方請各位同學斧正。呵呵。 蘋果有自己的訊息推送機制。安

react native 修改Switch顏色樣式

      最近在使用Switch控制元件的時候。官方文件是這樣的 <Switch value={(this.state && this.state.switchValue) || false} onVal