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


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>- просто к сведению
Питер


4

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


3

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

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

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


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или другими реквизитами.


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, если кнопка отключена.


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
  }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.