Disabilitare i pulsanti su reattivo nativo


155

Sto realizzando un'app per Android utilizzando la reattiva nativa e ho usato il componente TouchableOpacity per creare pulsanti.
Uso un componente di input di testo per accettare il testo dell'utente e il pulsante deve essere abilitato solo quando l'input di testo corrisponde a una determinata stringa.
Mi viene in mente un modo per farlo eseguendo inizialmente il rendering del pulsante senza il wrapper TouchableOpactiy e il rendering con il wrapper una volta che la stringa di input corrisponde.
Ma suppongo che ci sia un modo molto migliore per farlo. Qualcuno può aiutare?

Risposte:


308

TouchableOpacitysi estende TouchableWithoutFeedback, quindi puoi semplicemente usare la disabledproprietà:

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

Documentazione React Native TouchableWithoutFeedback #disabled


Bene, hai qualcosa che potrebbe dare un suggerimento su ciò che non funziona per te? Quale versione di RN usi? Puoi mostrarci un po 'di codice? Solo un link alla documentazione RN per aiutarti: facebook.github.io/react-native/docs/…
Julien Deniau,

9
Si noti che lo disabledstato non modifica gli stili di rendering figlio, quindi per rendere visibile agli utenti lo stato disabilitato, è necessario applicare uno stile Textall'elemento come <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- solo una FYI
Peter Theill

46

Fallo e basta

<TouchableOpacity activeOpacity={disabled ? 1 : 0.7} onPress={!disabled && onPress}>
  <View>
    <Text>{text}</Text>
  </View>
</TouchableOpacity>

<Text>{text}</FontText>? Fonttext?
jcollum,

11
onPress non si aspetta un booleano
Fábio Paiva il


3

TouchableOpacity riceve activeOpacity. Puoi fare qualcosa del genere

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

Quindi, se è abilitato, sembrerà normale, altrimenti sembrerà touchable senza risposta.


1
Ma ciò non lo disabilita ancora. Semplicemente non cambia l'opacità al tatto.
Jeff P Chacko,

1
Potresti fare qualcosa come onPress = {@ someMethod se abilitato}. In questo modo, non dovrai avvolgere la tua vista in diverse viste o touchables.
eyal83,

3

questa base nativa esiste una soluzione:

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

2

Per disabilitare il testo devi impostare l'opacità: 0 in Stile testo in questo modo:

<TouchableOpacity style={{opacity:0}}>
  <Text>I'm disabled</Text>
</TouchableOpacity>


0

Sono stato in grado di risolvere questo problema mettendo un condizionale nella proprietà 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
}
})

0

Ecco il mio lavoro per questo spero che possa aiutare:

<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.inputStylecontiene lo stile per il pulsante quando è disabilitato o meno, quindi in style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}aggiungo la proprietà di opacità se il pulsante è disabilitato.


0

È possibile abilitare e disabilitare il pulsante o utilizzando la condizione o direttamente per impostazione predefinita sarà disabilitato: vero

 // 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>

0

Penso che il modo più efficace sia avvolgere l'Opacità toccabile con una vista e aggiungere il puntatore a puntello Evento con una condizione di stile.

<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
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.