Почему React Native видит OnPress с неправильной точки зрения? - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю приложение с этим макетом. Я использую компонент автозаполнения из https://github.com/mrlaessig/react-native-autocomplete-input/. За результатами автозаполнения находится scrollView с элементами, которые можно нажимать. В IOS все работает нормально, но в Android, если я пытаюсь выбрать элемент из компонента автозаполнения вместо того, чтобы видеть щелчок в автозаполнении, он вместо этого отображает щелчок, как будто я нажал на представление, которое находится позади него. Так, например, на этом изображении, если я нажимаю на Яблочное пюре, вместо того, чтобы оно запускало событие щелчка яблочного пюре, оно запускает событие щелчка элемента 1.

Incorrect onPress events

Воткод для этого вида:

import {
    Platform,
    ScrollView,
    StyleSheet,
    Text,
    TouchableOpacity,
    View
} from "react-native";

import Autocomplete from "react-native-autocomplete-input";

export default function HomeScreen() {
    const [searchString, setSearchString] = useState("");

    const data = [
        { name: "Apple", key: "1" },
        { name: "AppleSauce", key: "2" },
        { name: "Apple Juice", key: "3" },
        { name: "Banana", key: "4" },
        { name: "Pear", key: "5" },
        { name: "Pear2", key: "6" },
        { name: "Pear3", key: "7" }
    ];

    const findFruit = query => {
        if (query === null || query === "") {
            return [];
        }
        const regex = new RegExp(`${query.trim()}`, "i");
        const results = data.filter(fruit => fruit.name.search(regex) == 0);
        return results;
    };

    const acSearchResults = findFruit(searchString);

    return (
        <View style={styles.pageContainer}>
            <View style={styles.pageHeaderSection}>
                <Text style={styles.title}>Title here</Text>
                <View style={styles.filterRow}>
                    <View style={styles.pickerContainer}>
                        <Text>Picker</Text>
                    </View>
                    <View style={styles.acMasterContainer}>
                        <View style={styles.autocompletesContainer}>
                            <Autocomplete
                                data={acSearchResults}
                                defaultValue={searchString}
                                onChangeText={text => setSearchString(text)}
                                renderItem={({ item, i }) => (
                                    <TouchableOpacity
                                        onPress={() =>
                                            alert(
                                                "you clicked item:" + item.name
                                            )
                                        }
                                    >
                                        <Text>{item.name}</Text>
                                    </TouchableOpacity>
                                )}
                            />
                        </View>
                    </View>
                    <View style={styles.thirdContainer}>
                        <Text>More content</Text>
                    </View>
                </View>
            </View>
            <ScrollView style={styles.scrollView}>
                <TouchableOpacity onPress={() => alert("item clicked")}>
                    <View style={styles.scrollItem}>
                        <Text>Item #1</Text>
                    </View>
                </TouchableOpacity>
                <TouchableOpacity onPress={() => alert("item clicked")}>
                    <View style={styles.scrollItem}>
                        <Text>Item #2</Text>
                    </View>
                </TouchableOpacity>
                <TouchableOpacity onPress={() => alert("item clicked")}>
                    <View style={styles.scrollItem}>
                        <Text>Item #3</Text>
                    </View>
                </TouchableOpacity>
            </ScrollView>
        </View>
    );
}

HomeScreen.navigationOptions = {
    header: null
};

const styles = StyleSheet.create({
    pageContainer: {
        flexGrow: 1,
        backgroundColor: "#fff"
    },
    pageHeaderSection: {
        marginTop: 35,
        zIndex: 10,
        backgroundColor: "red",
        justifyContent: "flex-end"
    },
    pickerContainer: {
        flex: 1,
        backgroundColor: "yellow"
    },
    acMasterContainer: {
        flexGrow: 1
    },
    autocompletesContainer: {
        paddingTop: 0,
        flex: 1,
        zIndex: 2,
        width: "100%",
        position: "absolute",
        left: 0,
        right: 0,
        top: 0,
        backgroundColor: "black"
    },
    acResultsList: {
        zIndex: 300,
        elevation: Platform.OS === "android" ? 10 : 0
    },
    acText: {
        zIndex: 20,
        fontSize: 14,
        color: "#2f354b",
        textAlign: "center"
    },
    thirdContainer: {
        flex: 1
    },
    filterRow: {
        backgroundColor: "blue",
        flexDirection: "row",
        height: 42
    },
    inputContainerStyle: {
        flexGrow: 1,
        backgroundColor: "red"
    },
    resultsText: {
        color: "black"
    },
    scrollView: {
        backgroundColor: "gray"
    },
    scrollItem: {
        backgroundColor: "purple",
        flexGrow: 1,
        height: 50
    }
});

Кто-нибудь еще видел эту проблему и нашел решение? Это похоже на проблему zIndex, но я перепробовал все, что мог придумать в отношении zIndex и повышения, и ничего не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...