Вимкнення кнопок на нативної реакції


155

Я роблю додаток для Android, використовуючи натиснуту реакцію, і я використовував компонент TouchableOpacity для створення кнопок.
Я використовую компонент для введення тексту, щоб прийняти текст від користувача, і кнопку слід увімкнути лише після того, як введення тексту збігається з певним рядком.
Я можу придумати спосіб, як це зробити, спочатку вивівши кнопку без обгортки TouchableOpactiy і повторно виправляючи за допомогою обгортки, коли рядок введення збігається.
Але я здогадуюсь, є набагато кращий спосіб зробити це. Хтось може допомогти?

Відповіді:


307

TouchableOpacityрозширення TouchableWithoutFeedback, тож ви можете просто використовувати disabledвластивість:

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

Документація React Native TouchchableWithoutFeedback #disabled


Ну, чи є у вас щось, що могло б підказати, що це не працює для вас? Яку версію RN ви використовуєте? Чи можете ви показати нам якийсь код? Просто посилання на документацію RN, яка допоможе вам: facebook.github.io/react-native/docs/…
Жульєн Деняу

9
Зауважте, що disabledстан не змінює стилів дочірнього відображення, тому для того, щоб зробити відключений стан видимим для користувачів, вам потрібно застосувати стиль до такого Textелемента, як <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- просто FYI
Peter Theill

46

Просто зробіть це

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

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

11
onPress не очікує булевого
Fábio Paiva

4

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


3

TouchchableOpacity отримує activeOpacity. Можна зробити щось подібне

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

Отже, якщо це ввімкнено, воно буде виглядати нормально, інакше воно буде виглядати так само, як дотик без зворотного зв'язку.


1
Але це все одно не відключає. Просто не змінюється непрозорість на дотик.
Jeff P Chacko

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

Щоб відключити текст, потрібно встановити непрозорість: 0 у такому стилі тексту:

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


0

Мені вдалося виправити це, ввівши умовне властивість стилю.

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

Я думаю, що найефективнішим способом є обернути дотичний потенціал з видом і додати опорний покажчикEvents з умовою стилю.

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