KeyboardAvoidingView не работает должным образом

KeyboardAvoidingView не работает должным образом

Я пытаюсь использовать KeyboardAvoidingView с behavior="padding".

По какой-то причине, когда я пытаюсь ввести любой текст в TextInput, под TextInput есть пробел. Приложено изображение того, что происходит, а также код. Есть ли у кого-нибудь шанс понять, что здесь происходит?

Whats-App-Image-2018-01-24-at-5-07-46-PM

  render() {
    return (

      <KeyboardAvoidingView  style={{ flex: 1}}  behavior="padding">
      < View
          style={{
            flex: 1,

          backgroundColor: "#FFFFFF",

        }}
      >

        <ScrollView
          contentContainerStyle={{ justifyContent: "flex-end", flex: 1 }}>
                <ChatInfo />
              </ScrollView>


          <View style={styles.container}>
          <TextInput
            style={styles.input}
            underlineColorAndroid="transparent"
            autoCapitalize="none"
            onChangeText={text => this.setState({ text: text })}
            value={this.state.text}
          />

          <TouchableOpacity
            style={styles.submitButton}
            onPress={this.submitName}
          >
            <Text style={styles.submitButtonText}> SEND </Text>
          </TouchableOpacity>
        </View>

      </ View>
      </KeyboardAvoidingView>
    );
  }
}

export default connect()(ChatScreen);

const styles = StyleSheet.create({
  input: {
    margin: 2,
    paddingLeft: 15,
    flex: 1,
    height: 40,
    padding: 10,
    fontSize: 14,
    fontWeight: "400"
  },

      container: {
        borderTopWidth: 1,
        minWidth: "100%",
        borderColor: "#cccccc",
        height: 44,
        flexDirection: "row",
        justifyContent: "space-between",
        backgroundColor: "#fff"

      },

  submitButtonText: {
    color: "#0a9ffc",
    fontSize: 14,
    fontWeight: "500"
  },

  submitButton: {
    backgroundColor: "#fff",
    padding: 10,
    margin: 2,
    height: 40,
    alignItems: "center",
    justifyContent: "center"
  }
});

Ответ 1

Если вы используете интерактивную навигацию, на это влияет заголовок реакции-навигации. Высота заголовка зависит от разных мобильных экранов. Таким образом, вы должны получить высоту заголовка и перейти в реквизиты клавиатуры VerticalOffset.

import { Header } from 'react-navigation';

<KeyboardAvoidingView
  keyboardVerticalOffset = {Header.HEIGHT + 20} // adjust the value here if you need more padding
  style = {{ flex: 1 }}
  behavior = "padding" >

  <ScrollView>
    <TextInput/>
    <TextInput/>
    <TextInput/>
    <TextInput/>
    <TextInput/>
    <TextInput/>
  </ScrollView> 

</KeyboardAvoidingView>

Ответ 2

Это известная проблема с KeyboardAvoidingView и Android. Существует несколько способов решения этой проблемы.

React Собственная документация говорит:

Android может вести себя лучше, если вообще не использовать поведение, тогда как iOS противоположна.

Итак, если вы работаете только с Android, вы можете удалить поведенческую поддержку, и она должна работать сразу. Для достижения наилучших результатов добавьте android:windowSoftInputMode="adjustResize" к вашему манифесту.

В качестве альтернативы вы можете указать значение смещения, которое работает для вас примерно так:   KeyboardAvoidingView keyboardVerticalOffset={-500} behavior="padding"

Для ios делать то же самое условно:

behavior= {(Platform.OS === 'ios')? "padding" : null}

keyboardVerticalOffset={Platform.select({ios: 0, android: 500})}

Ответ 3

ПРЕДУПРЕЖДЕНИЕ

Это, по-видимому, лишь частичное решение, хотя оно работает изначально, если телефон Android заблокирован на экране с клавиатурой, избегающей компоновки, когда вы разблокируете, вы снова получите дополнительное дополнение над клавиатурой.

ТЛ; др

Удалить android:windowSoftInputMode="adjustResize" из AndroidManifest.xml

До

...
<activity
  android:name=".MainActivity"
  android:label="@string/app_name"  
  android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
  android:windowSoftInputMode="adjustResize"
  >
...

После

...
<activity
  android:name=".MainActivity"
  android:label="@string/app_name"  
  android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
  >
...

Зачем

Если я правильно понимаю проблему, я имею дело с тем же. Имея android:windowSoftInputMode="adjustResize" в манифесте, система Android попытается выполнить ту же работу, что и KeyboardAvoidingView. Это приводит к добавлению дополнительного интервала над клавиатурой только на Android.

Если вы работаете на обеих платформах, вам придется иметь дело с этим на iOS каждый раз, когда вы работаете с клавиатурным вводом, поэтому лучше всего удалить специфическое поведение android:windowSoftInputMode="adjustResize" из манифеста и каждый раз использовать KeyboardAvoidingView,

Ответ 4

KeyboardAvoidingView должен быть ScrollView, а не наоборот. Таким образом, он ведет себя нормально (нормально, для каких целей я его использую). Попробуйте и дайте мне знать, как все прошло.

<ScrollView>
    <KeyboardAvoidingView styles={styles.container} behavior='padding'>

    </KeyboardAvoidingView>
</ScrollView>

Ответ 5

<KeyboardAvoidingView styles={styles.container} behavior = 'padding'  enabled>
   <ScrollView>

        <View>
          ....
        </View>

   </ScrollView>
</KeyboardAvoidingView>

Ответ 6

Я думаю, что это потому, что поведение поддерживает значение, поэтому я думаю, что добавление этой строки в клавиатуре AvoidView поможет

<KeyboardAvoidingView
    style = {{ flex: 1 }}
    behavior={Platform.OS === "ios" ? "padding" : null}>
</KeyboardAvoidingView>