Отключение кнопок реагирует на родную

155

Я делаю приложение для Android, используя реагировать родной, и я использовал компонент TouchableOpacity для создания кнопок.
Я использую компонент ввода текста, чтобы принять текст от пользователя, и кнопка должна быть включена только после того, как ввод текста соответствует определенной строке.
Я могу придумать способ сделать это, сначала визуализируя кнопку без оболочки TouchableOpactiy, и повторно визуализируя ее с помощью совпадения входной строки.
Но я предполагаю, что есть гораздо лучший способ сделать это. Кто-нибудь может помочь?

Джефф П Чакко
источник

Ответы:

308

TouchableOpacityэкстенты TouchableWithoutFeedback, так что вы можете просто использовать disabledсвойство:

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

Реагировать на родную TouchableWithoutFeedback #disabled документацию

Жюльен Денио
источник
Хорошо, у вас есть что-нибудь, что может дать подсказку о том, что это не работает для вас? Какую версию RN вы используете? Можете ли вы показать нам код? Просто ссылка на документацию RN, чтобы помочь вам: facebook.github.io/react-native/docs/…
Julien
9
Обратите внимание, что это disabledсостояние не меняет дочерние стили рендеринга, поэтому для того, чтобы отключенное состояние было видимым для пользователей, вам необходимо применить стиль к Textэлементу, например, <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- просто к сведению
Питер
46

Просто сделай это

<TouchableOpacity activeOpacity={disabled ? 1 : 0.7} onPress={!disabled && onPress}>
  <View>
    <Text>{text}</Text>
  </View>
</TouchableOpacity>
Высокий мальчик
источник
<Text>{text}</FontText>? FontText?
17
11
onPress не ожидает логического значения
Фабио Пайва
4

Это похоже на то, что можно решить с помощью компонента высшего порядка. Хотя я могу ошибаться, потому что я изо всех сил пытаюсь понять это на 100%, но, возможно, это будет полезно для вас (вот несколько ссылок) ...

Крис Гейрман
источник
3

TouchableOpacity получает activeOpacity. Вы можете сделать что-то вроде этого

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

Поэтому, если он включен, он будет выглядеть нормально, в противном случае он будет выглядеть как touchable без обратной связи.

eyal83
источник
1
Но это все еще не отключает это. Просто не меняет прозрачность при прикосновении.
Джефф П Чакко
1
Вы можете сделать что-то вроде onPress = {@ someMethod, если включено}. Таким образом, вам не нужно будет оборачивать свое представление в различные виды или сенсорные элементы.
eyal83
3

На этой нативной базе есть решение:

<Button
    block
    disabled={!learnedWordsByUser.length}
    style={{ marginTop: 10 }}
    onPress={learnedWordsByUser.length && () => {
      onFlipCardsGenerateNewWords(learnedWordsByUser)
      onFlipCardsBtnPress()
    }}
>
    <Text>Let's Review</Text>
</Button>
Аня Ишмухаметова
источник
2

Чтобы отключить Text, вы должны установить непрозрачность: 0 в стиле Text следующим образом:

<TouchableOpacity style={{opacity:0}}>
  <Text>I'm disabled</Text>
</TouchableOpacity>
Датский хасан
источник
0

Вы можете построить CustButton с TouchableWithoutFeedback, и установить эффект и логику вы хотите с onPressIn, onPressoutили другими реквизитами.

Fomahaut
источник
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>

in SignUpStyleSheet.inputStyleсодержит стиль кнопки, когда она отключена или нет, затем style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}я добавляю свойство opacity, если кнопка отключена.

Xdabier
источник
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
  }
Аммар Исмаил
источник