स्क्रॉलव्यू में स्क्रॉल करने में असमर्थ
मेरे पास एक स्क्रीन है जहां मैं इनपुट क्षेत्र में टाइप करता हूं और तदनुसार खोज परिणाम प्राप्त करता हूं। यह सूची एक स्क्रॉल दृश्य में दी गई है, लेकिन यह तब भी मुझे स्क्रॉल नहीं करने देता जब कीपैड खुला होता है (Android में)।
मैं इसे कैसे ठीक करूं?
return (
<>
{addressesFound.length > 0 ? (
<ScrollView
style={styles.searchResultsContainer}
keyboardShouldPersistTaps={'always'}
keyboardDismissMode={'on-drag'}>
{addressesFound.map((addressDetails: addressDetailsType) => {
return (
<View
key={addressDetails.placeName}
style={styles.resultContainer}>
<Text
style={styles.text}>
{addressDetails.placeName}
</Text>
</View>
);
})}
</ScrollView>
) : null}
</>
);
};
const styles = StyleSheet.create({
searchResultsContainer: {
width: moderateScale(400),
paddingHorizontal: moderateScale(50),
paddingRight: moderateScale(65),
marginTop: moderateScale(10),
flex:1,
},
resultContainer: {
marginTop: moderateScale(10),
borderBottomWidth: 1,
borderBottomColor: 'grey',
},
text: {
fontSize: moderateScale(15),
},
});
मैंने पहले से ही nestedScrollEnabled = {true} को जोड़ने का प्रयास किया है, लेकिन इससे कोई फर्क नहीं पड़ता।
यह वह जगह है जहाँ उपर्युक्त घटक कहा जाता है:
<View style={styles.dropdown}>
<LocationsFound
addressesFound={locations.addressesFoundList} />
....
dropdown: {
position: 'absolute',
top: moderateScale(215),
zIndex: moderateScale(10),
backgroundColor: '#fff',
flex: 1,
},
मैंने ऊंचाई जोड़ने की कोशिश की: 80% तक dropdown
। यह थोड़ा स्क्रॉल करना संभव बनाता है। हालाँकि, जब कीपैड खुला होता है तो मैं स्क्रॉल कर सकता हूं लेकिन अंत तक नहीं। यदि मैं ऊंचाई जोड़ूं: 100%, तो मैं स्क्रॉल करने में सक्षम नहीं हूं।
जवाब
मैंने आपकी समस्या के लिए एक एक्सपो स्नैक बनाया और इसकी जांच की। मुझे लगता है कि मैंने इसे हल कर दिया। इस पर एक नज़र मारो:
यह एक्सपो स्नैक की लिंक है
इसके बारे में बताने के लिए:
जैसा कि मुझे पता चला, आपकी समस्या यह थी कि ScrollView
किसी भी स्थिति में ऊँचाई नहीं बदल रही थी, यहाँ तक कि अधिक height
या देकर भी paddingBottom
।
इसलिए मैंने ScrollView
एक View
टैग में लपेटा और इसे यह स्टाइल दिया:
scrollViewWrapper: {
width: '100%',
minHeight: '100%',
paddingBottom: 1.3*keyboardHeight
}
इस स्टाइलिंग में, आप पैरामीटर देखते हैं keyboardHeight
, जो state
कि मैं componentDidMount
नीचे दिए गए कोड के साथ सेट कर रहा हूं :
import {Keyboard} from 'react-native';
state = {
keyboardHeight: 0,
}
componentDidMount() {
this.keyboardDidShowListener = Keyboard.addListener(
'keyboardDidShow',
this._keyboardDidShow
);
this.keyboardDidHideListener = Keyboard.addListener(
'keyboardDidHide',
this._keyboardDidHide
);
}
_keyboardDidShow = (e) => {
this.setState({
keyboardHeight: e.endCoordinates.height,
});
};
मुझे यह उल्लेख करना होगा कि आप paddingBottom: 1.3*keyboardHeight
वर्ग घटक के बाहर की शैली को स्थानांतरित नहीं कर सकते हैं और इसे styles
ऑब्जेक्ट में रख सकते हैं , क्योंकि keyboardHeight
यह एक है state
, इसे घटक के अंदर ही जाना जा सकता है।
मेरा सुझाव है कि आप मेरे विवरण को बेहतर ढंग से समझने के लिए एक्सपो स्नैक में मेरे कोड पर एक नज़र डालें।
मुझे उम्मीद है कि यह आपकी समस्या को हल करेगा।
कार्यात्मक घटकों के लिए संपादित करें
कार्यात्मक घटक लिखते समय कीबोर्ड ऊंचाई का पता लगाने के लिए नीचे दिए गए कोड का उपयोग करें:
const [keyboardHeight, setKeyboardHeight] = useState(0)
const [scrollViewVisibility, setScrollViewVisibility] = useState(false)
useEffect(() => {
Keyboard.addListener("keyboardDidShow", _keyboardDidShow);
// cleanup function
return () => {
Keyboard.removeListener("keyboardDidShow", _keyboardDidShow);
};
}, []);
const _keyboardDidShow = (e) => {
console.log("============in keyboardDidShow")
setKeyboardHeight(e.endCoordinates.height)
};
मैंने एक्सपो स्नैक का भी संपादन किया । आप एक काम कर रहे उदाहरण को देखने के लिए इसे देख सकते हैं।
मैं तीन समाधानों के बारे में सोच सकता हूं (आप या तो एक कोशिश कर सकते हैं):
1-फ्लेक्स = 1 जैसे दृश्य टैग के अंदर स्क्रॉल दृश्य को लपेटने का प्रयास करें:
<View style={{ flex:1 }}>
<ScrollView>
</ScrollView>
</View>
2-यदि आप एक दृश्य का उपयोग नहीं करना चाहते हैं तो आप स्क्रॉलव्यू फ्लेक्स को 1 पर सेट कर सकते हैं
3-पहले समाधान में आप दृश्य के बजाय खाली टैग का उपयोग कर सकते हैं:
<>
</>
यदि आपकी समस्या केवल कीपैड ओपन के साथ है, तो आप KeyboardAvoidingView पर एक नज़र डालना चाहते हैं
मुझे इससे बहुत समस्याएँ हैं! आप प्रोप के लिए सभी सेटिंग्स की कोशिश करना चाहते हैं behavior
। वहाँ शायद एक है कि आप के लिए काम करता है!
उनके उदाहरणों से:
import React from 'react';
import { View, KeyboardAvoidingView, TextInput, StyleSheet, Text, Platform,
TouchableWithoutFeedback, Button, Keyboard } from 'react-native';
const KeyboardAvoidingComponent = () => {
return (
<KeyboardAvoidingView
behavior={Platform.OS == "ios" ? "padding" : "height"}
style={styles.container}
>
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.inner}>
<Text style={styles.header}>Header</Text>
<TextInput placeholder="Username" style={styles.textInput} />
<View style={styles.btnContainer}>
<Button title="Submit" onPress={() => null} />
</View>
</View>
</TouchableWithoutFeedback>
</KeyboardAvoidingView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1
},
inner: {
padding: 24,
flex: 1,
justifyContent: "space-around"
},
header: {
fontSize: 36,
marginBottom: 48
},
textInput: {
height: 40,
borderColor: "#000000",
borderBottomWidth: 1,
marginBottom: 36
},
btnContainer: {
backgroundColor: "white",
marginTop: 12
}
});
export default KeyboardAvoidingComponent;
मुझे लगता है कि यदि आपका स्क्रॉल दृश्य सामग्री स्क्रीन से छोटा है, तो यह स्क्रॉल नहीं होगा। तो आप ऊंचाई बनाने की कोशिश कर सकते हैं: "150%" या ऐसा कुछ या अपनी स्क्रीन के लिए अपने स्क्रॉलव्यू को ऊंचा करने के लिए ऊंचाई के साथ खाली दृश्य में जोड़ें।
स्क्रॉलिंग व्यू को ऊंचाई वाले दृश्य में लपेटना> स्क्रीन भी काम करेगी।
मुझे लगता है कि आप नीचे दिए गए सुझावों के द्वारा इस मुद्दे को ठीक कर सकते हैं: 1) स्क्रॉलव्यू टैग स्थिति को समायोजित करना सबसे संभवत: यह आपकी स्थिति के ऊपर सीधे जाएगा <> </> या स्क्रॉल टैग के ऊपर दृश्य टैग जोड़ें, जैसे
<><View style={{ Height: "auto", maxHeight: screenHeight}}><ScrollView>....</ScrollView></view></>
2) ऊंचाई, अधिकतम संपत्ति और फ्लेक्स संपत्ति को समायोजित करके
अगर यह आपके लिए काम करता है तो कृपया मुझे बताएं