反応ネイティブのボタンを無効にする


155

リアクションネイティブを使用してAndroidアプリを作成し、TouchableOpacityコンポーネントを使用してボタンを作成しました。
テキスト入力コンポーネントを使用してユーザーからのテキストを受け入れます。ボタンは、テキスト入力が特定の文字列と一致した場合にのみ有効にする必要があります。
最初にTouchableOpactiyラッパーなしでボタンをレンダリングし、入力文字列が一致するとラッパーで再レンダリングすることで、これを行う方法を考えることができます。
しかし、これを行うにはもっと良い方法があると思います。誰か助けてもらえますか?

回答:


305

TouchableOpacityエクステントなTouchableWithoutFeedbackので、disabledプロパティを使用することができます:

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

React Native TouchableWithoutFeedback #disabledドキュメント


まあそれがあなたのために何がうまくいっていないのかについてのヒントを与えるかもしれない何かがありますか?どのバージョンのRNを使用していますか?コードを見せていただけますか?ただ、RNのドキュメントへのリンクはあなたを助けるために:facebook.github.io/react-native/docs/...
ジュリアンDeniau

9
disabled状態は子のレンダリングスタイルを変更しないことに注意してください。無効な状態をユーザーに表示するには、Text要素にスタイルを適用する必要があります。たとえば<Text style={{ opacity: 0.5 }}>I'm disabled</Text>、FYI
Peter Theill


4

これは、高次コンポーネントを使用して解決できるようなもののようです。私はそれを自分で100%理解するのに苦労しているので間違っているかもしれませんが、多分それはあなたに役立つでしょう(ここにいくつかのリンクがあります)...


3

TouchableOpacityが受け取りactiveOpacityます。あなたはこのようなことをすることができます

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

したがって、有効になっている場合は正常に見え、そうでない場合はtouchablewithoutfeedbackと同じように見えます。


1
しかし、それでも無効にはなりません。タッチしても不透明度は変わりません。
Jeff P Chacko

1
onPress = {@ someMethod if enabled}のようなことができます。このようにして、ビューを別のビューやタッチャブルでラップする必要がなくなります。
eyal83 2015年

3

このネイティブベースのソリューションがあります:

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

2

テキストを無効にするには、次のようなテキストスタイルでopacity:0を設定する必要があります。

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


0

これを修正するには、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

これの私の回避策は次のとおりです。

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

SignUpStyleSheet.inputStyleボタンのスタイルを保持しているときに無効になっているかいないし、中にstyle={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}ボタンが無効になっている場合、私は不透明度プロパティを追加します。


0

ボタンを有効または無効にしたり、条件を使用したり、デフォルトで直接無効にしたりできます: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>

0

最も効率的な方法は、touchableOpacityをビューでラップし、スタイル条件でprop pointerEventsを追加することだと思います。

<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
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.