android.widget.imageview无法强制转换为android.view.viewgroup(仅限android,ios即可)

时间:2017-06-08 03:04:24

标签: android debugging react-native nested imageview

我开发了一个反应原生0.43.3的项目

我在iOS中开发和测试所有项目时犯了一个错误。 (在那里工作正常)

问题是当我尝试生成APK以上传到PlayStore,并在设备中测试时发现错误:

android.widget.imageview无法强制转换为android.view.viewgroup

我的主要问题是如何显示错误。处于死机的红色屏幕,我不知道如何找到反应原生的行和组件在哪里发生错误。我想也许我无法实现,因为javascript代码已经编译。

无论如何,我不知道如何解决问题。

我想也许是因为我在图像中使用了微调器(以显示正在加载的图像),例如:

  <View style={[styles.resourceActions]}>
      <Image
        style={{width: imgWidth, height: imgHeight}}
        source={{uri: this.props.imageUrl}}
        onLoad = {() => this.setState({ loading: false })}
      >
      <ActivityIndicator
          animating={this.state.loading}
          style={[styles.spinner, styles.centering, {marginTop: this.state.loadingMarginTop}]}
          size="large"
        />
        </Image>
    </View>

但我不知道,因为我在很多部分和视图中使用了imageview(和fastimage组件)

我的依赖项:

"@remobile/react-native-refresh-infinite-listview": "^1.0.6",
"react": "16.0.0-alpha.6",
"react-native": "0.43.3",
"react-native-camera": "git+https://github.com/lwansbrough/react-native-camera.git",
"react-native-device-info": "^0.10.2",
"react-native-fast-image": "0.0.9",
"react-native-google-analytics-bridge": "^5.0.1",
"react-native-htmlview": "^0.9.0",
"react-native-loading-spinner-overlay": "^0.4.4",
"react-native-material-design": "^0.3.7",
"react-native-modalbox": "^1.3.9",
"react-native-photo-view": "^1.2.0",
"react-native-qrcode-scanner": "0.0.11",
"react-native-qrcode-svg": "^5.0.0",
"react-native-radio-buttons": "^0.14.0",
"react-native-router-flux": "3.38.0",
"react-native-share": "^1.0.20",
"react-native-side-menu": "^0.20.1",
"react-native-svg": "^5.1.7",
"react-native-vector-icons": "^4.0.1"

感谢我的问题中的任何方向

2 个答案:

答案 0 :(得分:1)

原生Android 中,我们无法将ImageView强制转换为ViewGroup,因为ImageView不会扩展类ViewGroup。实际上,这种铸造是不可能的。

答案 1 :(得分:0)

投射(在这种情况下是向下转发)

简单来说就是将一个特定类型的对象“转变为”另一个继承自第一个类型的对象类型。 转换不是在编译时检查,而是在运行时检查。 基本上你是对编译器'相信我,你可以把这个对象看作是这种类型的'。

示例:

Object aSentenceObject = "This is just a regular sentence";
String aSentenceString = (String) aSentenceObject;

现在..记得当我说我在运行时检查它?那么如果不能进行铸造会发生什么? 让我们说在这种情况下:

Object aSentenceObject = "This is just a regular sentence";
int aSentenceString = (int) aSentenceObject;

由于aSentenceObject无法转换为int,因此将抛出异常。像这样的东西

ClassCastException: java.lang.Object cannot be cast to java.lang.Integer

但这与您的案件有什么关系?

  

“使用React Native,您不会构建”移动网络应用“,”HTML5应用“,   或“混合应用程序”。你构建了一个真正的移动应用程序   与使用Objective-C或Java构建的应用程序无法区分。应对   Native使用与常规iOS和iOS相同的基本UI构建块   Android应用。“

正如官方React Native页面中所述,您的JavaScript代码会以某种方式编译为本机语言(在Android情况下为Java)。

  

我们可以看到each React Native control will interact with a native counterpart component。   “我们'允许'编写JavaScript,因为React Native为我们提供了帮助   使用JavaScript编写的控件。但这总是如此   以手机实际本土对手为支撑。反应原生   简单地允许桥梁进行双向通信“   正如this article

中所述

在原生android中,图片不能有子项(如ScrollView或ViewGroup) 因此,在将JS代码转换为Java的过程中,“翻译机器”会尝试将您的图像视为ViewGroup,因为它有子视图。 结果是你获得的

android.widget.imageview cannot be cast to android.view.viewgroup

<强>结论

如果删除该嵌套结构并将ActivityIndi​​cator组件放置为Image组件的兄弟,则应该修复它