2016-07-26 92 views
10

我正在玩反应本机,并得到了一个奇怪的行为。ReactNative ActivityIndi​​cator不显示动画属性启动虚假时

当我试图表明一个ActitvityIndi​​cator为Android其动画属性设置为true,在状态的showProgress变量如果变量开始为假这是行不通的。

在下面的示例中,如果ActivityIndi​​cator动画属性的起始值为true,那么按钮会使ActivityIndi​​cator隐藏或正确显示。

import React, { Component } from 'react'; 
import { 
    Text, 
    View, 
    StyleSheet, 
    TextInput, 
    TouchableHighlight, 
    ActivityIndicator 
} from 'react-native'; 

export class Login extends Component { 

    constructor(props) { 
     super(props); 

     this.state = { 
      showProgress: true 
     }; 
    } 

    render() { 
     return (
      <View> 

       <TouchableHighlight onPress={this.progressOff.bind(this)}> 
        <Text>progressOff</Text> 
       </TouchableHighlight> 

       <TouchableHighlight onPress={this.progressOn.bind(this)}> 
        <Text>progressOn</Text> 
       </TouchableHighlight> 

       <ActivityIndicator animating={this.state.showProgress} size="large"/> 
      </View> 
     ); 
    } 

    progressOff() { 
     this.setState({showProgress: false}); 
    } 

    progressOn() { 
     this.setState({showProgress: true}); 
    } 
} 

但是,如果使用下面的代码,用动画属性起假,那么按钮使ActivityIndi​​cator出现不工作:

import React, { Component } from 'react'; 
import { 
    Text, 
    View, 
    StyleSheet, 
    TextInput, 
    TouchableHighlight, 
    ActivityIndicator 
} from 'react-native'; 

export class Login extends Component { 

    constructor(props) { 
     super(props); 

     this.state = { 
      showProgress: false 
     }; 
    } 

    render() { 
     return (
      <View> 

       <TouchableHighlight onPress={this.progressOff.bind(this)}> 
        <Text>progressOff</Text> 
       </TouchableHighlight> 

       <TouchableHighlight onPress={this.progressOn.bind(this)}> 
        <Text>progressOn</Text> 
       </TouchableHighlight> 

       <ActivityIndicator animating={this.state.showProgress} size="large"/> 
      </View> 
     ); 
    } 

    progressOff() { 
     this.setState({showProgress: false}); 
    } 

    progressOn() { 
     this.setState({showProgress: true}); 
    } 
} 

缺少什么我在这里?

+0

是,对于IOS? https://facebook.github.io/react-native/docs/activityindicator.html#hideswhenstopped。默认情况下,它在动画设置为假时隐藏 –

+0

我有同样的问题,无法正常工作。当状态为假时,我最终在视觉上隐藏了指示符('{height:0}')。 – zvona

回答

12

这似乎是React Native中的一个错误。初始状态为showProgress: false的代码适用于iOS,但不适用于Android。

我已经在GitHub上开设了一个问题,如果你想跟着进展: https://github.com/facebook/react-native/issues/9023

选项1

我用一种解决方法是使用showProgress变量来呈现一个完全不同视图与ActivityIndicator

render() { 
    if (this.state.showProgress) { 
     return this.renderLoadingView(); 
    } else { 
     return this.renderMainView(); 
    } 
} 

选项2

您也可以根据国家规定的ActivityIndicator的不透明度:

render() { 
    return (
     <View> 

      <TouchableHighlight onPress={this.progressOff.bind(this)}> 
       <Text>progressOff</Text> 
      </TouchableHighlight> 

      <TouchableHighlight onPress={this.progressOn.bind(this)}> 
       <Text>progressOn</Text> 
      </TouchableHighlight> 

      <ActivityIndicator style={{opacity: this.state.showProgress ? 1.0 : 0.0}} animating={true} size="large"/> 
     </View> 
    ); 
} 

但是微调动画并不总是在同一位置使用此方法时开始。

+2

选项1是要走的路,谢谢! –

+0

如果你在'this.state'中存储'showProgress'变量,通过'this.setState()'改变它会触发一个更新,你可以使用this.forceUpdate()强制更新 – HimalayanCoder

+0

@HimalayanCoder自动重新渲染。无需使用'forceUpdate()' –

0

如果你的项目,你可以使用第三方组件,我建议使用react-native-loading-spinner-overlay

容易解决我们的问题,东阳这个组件使用类似的方式来显示或隐藏活动与物业visible

0

我得到这个问题都是由一个错误。我没有把ActivityIndeicator放在视图的中心。所以它位于视图的顶部,由一个natigation酒吧覆盖。以下代码是正确的。希望这可以帮助你。

<View style={{alignItems: 'center', justifyContent: 'center', flex: 1, backgroundColor: 'white'}}> 
    <ActivityIndicator 
    animating={true} 
    style={ 
     { 
     alignItems: 'center', 
     justifyContent: 'center', 
     opacity: this.state.loading ? 1 : 0 
     }} 
    size="large" 
    /> 
</View> 
1

这是阵营天然对于组分活动指示器的一个错误。 我不知道该FB已经解决了,但你可以试试这个

constructor(props) { 
     super(props); 
     this.state = { 
      opacity: 0 
     }; 
    } 

显示它使用this.setState({不透明度:1}),并再次隐藏this.setState({不透明度:0} )在调用的函数

和渲染,你正在使用活动的指标

<ActivityIndicator 
    animating={true} 
    color="#ffffff" 
    style={{height: 80, marginTop: 10, opacity: this.state.opacity }} 
    size="large"/> 
+0

智能解决方案! –

相关问题