Je crée une application Android à l'aide de react native et j'ai utilisé le composant TouchableOpacity pour créer des boutons.
J'utilise un composant de saisie de texte pour accepter le texte de l'utilisateur et le bouton devrait ne doit être activé que lorsque la saisie de texte correspond à une chaîne donnée.
Je peux imaginer un moyen de le faire en effectuant d'abord le rendu du bouton sans le wrapper TouchableOpactiy et en effectuant un nouveau rendu avec le wrapper une fois que la chaîne d'entrée correspond.
Mais je suppose qu’il existe une bien meilleure façon de procéder. Quelqu'un peut-il aider?
TouchableOpacity
étendues TouchableWithoutFeedback
, vous pouvez donc simplement utiliser la propriété disabled
:
<TouchableOpacity disabled={true}>
<Text>I'm disabled</Text>
</TouchableOpacity>
Réagir à la documentation TouchableWithoutFeedback Native #disabled
Fais juste ça
<TouchableOpacity activeOpacity={disabled ? 1 : 0.7} onPress={!disabled && onPress}>
<View>
<Text>{text}</Text>
</View>
</TouchableOpacity>
Cela semble être le genre de problème qui pourrait être résolu en utilisant un composant d'ordre supérieur. Je peux me tromper cependant car j'ai du mal à comprendre cela à 100% moi-même, mais peut-être que ça vous aidera (voici quelques liens) ...
TouchableOpacity reçoit activeOpacity
. Vous pouvez faire quelque chose comme ça
<TouchableOpacity activeOpacity={enabled ? 0.5 : 1}>
</TouchableOpacity>
Donc, si elle est activée, cela aura l'air normal, sinon, cela ressemblera à toucher sans retour en arrière.
Assurez-vous que TouchableOpacity
soit désactivé en utilisant le code suivant:
<TouchableOpacity disabled={true}>
<Text>Submit</Text>
</TouchableOpacity>
J'ai pu résoudre ce problème en mettant un conditionnel dans la propriété de 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
}
})
Je pense que le moyen le plus efficace consiste à envelopper la touchableOpacity avec une vue et à ajouter le prop pointeurEvents avec une condition de style.
<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
}
cette base native il y a une solution:
<Button
block
disabled={!learnedWordsByUser.length}
style={{ marginTop: 10 }}
onPress={learnedWordsByUser.length && () => {
onFlipCardsGenerateNewWords(learnedWordsByUser)
onFlipCardsBtnPress()
}}
>
<Text>Let's Review</Text>
</Button>
Vous pouvez activer et désactiver le bouton ou en utilisant la condition ou directement par défaut, il sera désactivé: 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>
Voici mon travail pour cela, j'espère que cela aide:
<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>
dans SignUpStyleSheet.inputStyle
conserve le style du bouton lorsqu'il est désactivé ou non, puis dans style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}
j'ajoute la propriété opacity si le bouton est désactivé.
Vous pouvez créer un CustButton avec TouchableWithoutFeedback
et définir l'effet et la logique souhaités avec onPressIn
, onPressout
ou d'autres accessoires.