Desativando botões no React Native

155

Estou criando um aplicativo Android usando o React Native e usei o componente TouchableOpacity para criar botões.
Eu uso um componente de entrada de texto para aceitar o texto do usuário e o botão deve ser ativado quando a entrada de texto corresponder a uma determinada sequência.
Posso pensar em uma maneira de fazer isso renderizando inicialmente o botão sem o wrapper TouchableOpactiy e renderizando novamente com o wrapper quando a sequência de entrada corresponder.
Mas acho que existe uma maneira muito melhor de fazer isso. Alguém pode ajudar?

Jeff P Chacko
fonte

Respostas:

305

TouchableOpacityextensões TouchableWithoutFeedback, então você pode simplesmente usar a disabledpropriedade:

<TouchableOpacity disabled={true}>
  <Text>I'm disabled</Text>
</TouchableOpacity>

React Native TouchableWithoutFeedback #disabled documentation

Julien Deniau
fonte
Bem, você tem algo que possa dar uma dica sobre o que não está funcionando para você? Qual versão do RN você usa? Você pode nos mostrar algum código? Apenas um link para a documentação RN para ajudá-lo: facebook.github.io/react-native/docs/...
Julien Deniau
9
Observe o disabledestado não muda os estilos de processamento filho para que, a fim de tornar o estado desativado visível para os usuários que você precisa para aplicar um estilo para o Textelemento como <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- apenas um FYI
Peter Theill
46

Apenas faça isso

<TouchableOpacity activeOpacity={disabled ? 1 : 0.7} onPress={!disabled && onPress}>
  <View>
    <Text>{text}</Text>
  </View>
</TouchableOpacity>
Tallboy
fonte
<Text>{text}</FontText>? FontText?
Jcollum #
11
onPress não está esperando um booleano
Fábio Paiva
3

TouchableOpacity recebe activeOpacity. Você pode fazer algo assim

<TouchableOpacity activeOpacity={enabled ? 0.5 : 1}>
</TouchableOpacity>

Portanto, se estiver ativado, parecerá normal, caso contrário, será semelhante ao toque sem feedback.

eyal83
fonte
1
Mas isso ainda não o desativa. Apenas não muda a opacidade ao tocar.
precisa
1
Você pode fazer algo como onPress = {@ someMethod, se ativado}. Dessa forma, você não precisará agrupar sua visualização em diferentes visualizações ou toques.
eyal83
3

nesta base nativa existe solução:

<Button
    block
    disabled={!learnedWordsByUser.length}
    style={{ marginTop: 10 }}
    onPress={learnedWordsByUser.length && () => {
      onFlipCardsGenerateNewWords(learnedWordsByUser)
      onFlipCardsBtnPress()
    }}
>
    <Text>Let's Review</Text>
</Button>
Anja Ishmukhametova
fonte
2

Para desabilitar o Texto, você deve definir a opacidade: 0 no estilo Texto, assim:

<TouchableOpacity style={{opacity:0}}>
  <Text>I'm disabled</Text>
</TouchableOpacity>
Dinamarquês Hassan
fonte
0

Você pode construir um CustButton com TouchableWithoutFeedback, e definir o efeito ea lógica que quiser com onPressIn, onPressoutou outros adereços.

Fomahaut
fonte
0

Consegui consertar isso colocando uma condicional na propriedade style.

const startQuizDisabled = () => props.deck.cards.length === 0;

<TouchableOpacity
  style={startQuizDisabled() ? styles.androidStartQuizDisable : styles.androidStartQuiz}
  onPress={startQuiz}
  disabled={startQuizDisabled()}
>
  <Text 
    style={styles.androidStartQuizBtn} 
  >Start Quiz</Text>
</TouchableOpacity>

const styles = StyleSheet.create({
androidStartQuiz: {
    marginTop:25,
    backgroundColor: "green",
    padding: 10,
    borderRadius: 5,
    borderWidth: 1
},
androidStartQuizDisable: {
    marginTop:25,
    backgroundColor: "green",
    padding: 10,
    borderRadius: 5,
    borderWidth: 1,
    opacity: 0.4
},
androidStartQuizBtn: {
    color: "white",
    fontSize: 24
}
})
Cory McAboy
fonte
0

Aqui está o meu trabalho para isso, espero que ajude:

<TouchableOpacity
    onPress={() => {
        this.onSubmit()
    }}
    disabled={this.state.validity}
    style={this.state.validity ?
          SignUpStyleSheet.inputStyle :
          [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}>
    <Text style={SignUpStyleSheet.buttonsText}>Sign-Up</Text>
</TouchableOpacity>

in SignUpStyleSheet.inputStylemantém o estilo do botão quando ele está desabilitado ou não; em seguida, style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}adiciono a propriedade opacity se o botão estiver desabilitado.

Xdabier
fonte
0

Você pode ativar e desativar o botão ou, usando a condição ou diretamente por padrão, será desativado: true

 // in calling function of button 
    handledisableenable()
        {
         // set the state for disabling or enabling the button
           if(ifSomeConditionReturnsTrue)
            {
                this.setState({ Isbuttonenable : true })
            }
          else
          {
             this.setState({ Isbuttonenable : false})
          }
        }

<TouchableOpacity onPress ={this.handledisableenable} disabled= 
     {this.state.Isbuttonenable}>

    <Text> Button </Text>
</TouchableOpacity>
keerthi c
fonte
0

Eu acho que a maneira mais eficiente é envolver o touchableOpacity com uma view e adicionar o prop pointerEvents com uma condição de estilo.

<View style={this.state.disabled && commonStyles.buttonDisabled}        
      pointerEvents={this.state.disabled ? "none" : "auto"}>
  <TouchableOpacity
    style={styles.connectButton}>
  <Text style={styles.connectButtonText}">CONNECT </Text>
  </TouchableOpacity>
</View>

CSS:

buttonDisabled: {
    opacity: 0.7
  }
Ammar Ismaeel
fonte