2016-04-07 3 views
8

einfach Scrollview mit mehreren TextInputs Stellen Sie sich vor, wieReagieren india zwei Hähnen erfordert Eingabefokus zu ändern, wenn innerhalb Scroll

<ScrollView style={styles.container}> 
    <TextInput style={styles.input} /> 
    <TextInput style={styles.input} /> 
    </ScrollView> 

Als ich das erste Eingabe eingeben, Tastatur öffnet und ich kann Text eingeben. Wenn ich zum zweiten Eingang wechseln möchte, muss ich zweimal tippen - der erste Typ schließt die Tastatur und nur der zweite Tipp öffnet die Tastatur für die zweite Eingabe.

Eine Lösung ist zu verwenden keyboardShouldPersistTaps={true} - Schaltung funktioniert gut, aber dann ist die Tastatur überhaupt nicht geschlossen und die Tastatur kann einige der späteren Eingänge (oder Tasten) abdecken. Ich kann auch keyboardDismissMode verwenden, aber nur die Tastatur beim Ziehen schließen.

Meine Frage ist, wie diese beiden Verhaltensweisen kombiniert werden - IMHO die beste Benutzererfahrung - wenn ich auf einen anderen Eingang klicke, wird der Fokus sofort geändert, ohne die Tastatur wieder zu öffnen und wenn ich irgendwo anders klopfe, wird die Tastatur geschlossen?

I RN0.22 und Beispielanwendung bin mit finden Sie unter https://rnplay.org/apps/kagpGw

UPDATE - Dieses Problem ist in RN 0.40 gelöst worden sein könnte - siehe https://github.com/facebook/react-native/commit/552c60192172f6ec503181c060c08bbc5cbcc5a4

Antwort

3

Diese SO answer ist nicht genau das, was Sie‘ Sie werden gefragt, aber wird das Fenster automatisch hinter der Tastatur herausziehen, wenn ein TextInput den Fokus hat; Lösen Sie Ihre Tastatur kann einige der späteren Eingaben (oder Tasten) Problem abdecken.

+0

danken Sie. Diese Antwort hilft, wenn Sie auf Eingabe klicken, und es wird dann von der Tastatur abgedeckt, sobald es geöffnet ist. Es wird Ihnen jedoch nicht helfen, wenn die zweite Eingabe (oder Schaltfläche) bereits abgedeckt ist - da dieser Trick nur die erste getippte Eingabe in "Ansicht" scrollt, aber es gibt keine Garantien über andere Komponenten. – sodik

3

Am Ende habe ich eine Lösung gefunden, die nicht optimal ist (aus Codierungssicht), aber aus der Benutzerperspektive funktioniert. Ich habe kleine Komponente, die anstelle von ScrollView verwendet werden können:

export class InputScrollView extends React.Component { 

    constructor(props, ctx) { 
     super(props, ctx); 
     this.handleCapture = this.handleCapture.bind(this); 
    } 

    render() { 
    return (
     <ScrollView keyboardShouldPersistTaps={true} keyboardDismissMode='on-drag'> 
     <View onStartShouldSetResponderCapture={this.handleCapture}> 
      {this.props.children} 
     </View> 
     </ScrollView> 
    ); 
    } 

    handleCapture(e) { 
    const focusField = TextInputState.currentlyFocusedField(); 
    const target = e.nativeEvent.target; 
    if (focusField != null && target != focusField){ 
     const inputs = this.props.inputs; 
     if (inputs && inputs.indexOf(target) === -1) { 
     dismissKeyboard(); 
     } 
    } 
    } 
} 

InputScrollView.propTypes = { 
    inputs : React.PropTypes.array, 
} 

Der einzige Nachteil ist, dass I-Knoten Handles erfassen muß alle Text Eingänge „Hand“ und gibt es an die Komponente (wie durch React.findNodeHandle zurück) als eine Anordnung.

+0

Würdest du bitte erklären, woher 'TextInputState' stammt? Welches Paket? – Kulbear

+0

kommt es mit RN - siehe https://github.com/facebook/react-native/search?utf8=%E2%9C%93&q=TextInputState - Ich habe es importiert wie 'Import TextInputState von 'TextInputState';' – sodik

+0

Danke , Ich gucke mal! @sodik – Kulbear

0

löste ich mein Problem mit diesem Code

<ScrollView 
    keyboardDismissMode='on-drag' 
    keyboardShouldPersistTaps={true} 
> 
+0

Das Problem ist, dass die Tastatur nicht geschlossen ist, wenn Sie nur außerhalb der Eingabe tippen. – sodik

0

ich die obige Antwort aktualisiert haben, weil die keyboardShouldPersistTaps = {true} veraltet ist und nun die keyboardShouldPersistTaps = 'immer'

verwendet wird
export class InputScrollView extends React.Component { 

    constructor(props, ctx) { 
     super(props, ctx); 
     this.handleCapture = this.handleCapture.bind(this); 
    } 

    render() { 
    return (
     <ScrollView keyboardShouldPersistTaps='always' keyboardDismissMode='on-drag'> 
     <View onStartShouldSetResponderCapture={this.handleCapture}> 
      {this.props.children} 
     </View> 
     </ScrollView> 
    ); 
    } 

    handleCapture(e) { 
    const focusField = TextInputState.currentlyFocusedField(); 
    const target = e.nativeEvent.target; 
    if (focusField != null && target != focusField){ 
     const inputs = this.props.inputs; 
     if (inputs && inputs.indexOf(target) === -1) { 
     dismissKeyboard(); 
     } 
    } 
    } 
} 

InputScrollView.propTypes = { 
    inputs : React.PropTypes.array, 
} 
Verwandte Themen