appears to be easy 使用 Java 来确定 Android 设备是否具有物理按钮,因此要在 React Native 中访问它,我将创建一个 Native Module 包装器以返回 ViewConfiguration.get(context).hasPermanentMenuKey() 的结果。
您可以在 Android Studio 中打开您的 React Native 项目的 /android 目录,然后在 /app/src/main/java/<com.companyname.appname>/ 文件夹中,在您看到 MainActivity 和 MainApplication 文件的同一级别,创建一个新的 Android 资源目录称为detecthardware(或任何其他适当的名称)。在其中创建 DetectHardwareModule.java 并包含以下内容:
package com.companyname.appname.detecthardware;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactMethod;
import java.util.List;
public class DetectHardwareModule extends ReactContextBaseJavaModule {
public DetectHardwareModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "DetectHardware";
}
@ReactMethod
public void hasHardwareButtons(final Callback callback) {
callback.invoke(ViewConfiguration.get(getReactApplicationContext()).hasPermanentMenuKey());
}
}
然后创建 DetectHardwarePackage.java 并包含以下内容:
package com.companyname.appname.detecthardware;
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.ArrayList;
import java.util.Collections;
import java.util.List;
public class DetectHardwarePackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new DetectHardwareModule(reactContext));
return modules;
}
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
在您的 MainApplication.java 中,您需要包含一个 getPackages
方法,以便 JavaScript 代码可以访问它:
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new DetectHardwarePackage()
);
}
现在在您的 React Native 组件中,确保您从 react-native 和 Platform 导入 NativeModules,以便您仅在 Android 上运行该函数。在componentDidMount:
componentDidMount() {
if (Platform.OS === 'android') {
NativeModules.DetectHardware.hasHardwareButtons(function(result) {
this.setState({hasHardwareButtons: result})
}.bind(this));
}
}
最后在您的render 函数中,如果平台是android 并且hasHardwareButtons 为真,则计算bottom 的数量为0,否则为45:
var bottom = (Platform.OS === 'android' && this.state.hasHardwareButtons) ? 0 : 45