Когда маркер нажат, я хочу нажать на него 3 раза

Возникла проблема с маркерами карты на Android и кажется, никто не может это исправить. Обходной путь состоит в том, чтобы коснуться маркера карты 3 раза, и он правильно откроет выноску / аннотацию с изображением внутри.

Как, я могу сделать это программно? Я хочу нажимать на маркер 3 раза каждый раз, когда пользователь нажимает.

<MapView.Marker
  key={marker.key}
  coordinate={marker.latlng}
  title={marker.title}
  description={marker.description}
>
  <MapView.Callout style={styles.annotation}>
    <Image
      key={marker.key}
      source={{ uri: marker.image }}
      style={styles.thumbnail}
    />
  </MapView.Callout>
</MapView.Marker>

person User    schedule 13.04.2017    source источник
comment
Вы уверены, что проблема не в другом? Можете ли вы поделиться частью своего кода здесь?   -  person Xidh    schedule 13.04.2017
comment
@Xidh Я добавил свой маркер и выноску к вопросу.   -  person User    schedule 13.04.2017
comment
@User, можете ли вы предоставить полный пример кода или скрипку?   -  person ProllyGeek    schedule 16.04.2017
comment
@ProllyGeek Если вы используете реактивные карты и просто делаете маркер с выноской, как у меня, а затем запускаете на Android, вы получите сообщение об ошибке.   -  person User    schedule 16.04.2017


Ответы (1)


tl;dr: Это невозможно по соображениям безопасности. Если бы пользовательское приложение могло создавать «синтетические» прикосновения, эта функция могла бы использоваться вредоносными приложениями, чтобы заставить устройство пользователя действовать «само по себе». Читайте дальше, если хотите прочитать мое исследование на тему тема.

Насколько я могу судить, вы не можете сделать это на стороне JavaScript React Native. Вам нужно будет настроить некоторую пользовательскую логику, чтобы генерировать собственные события на собственной стороне.

Причина этого в том, что JS-сторона React Native может обрабатывать только собственные события (например, касания), которые она получает через собственный мост. Эти события затем запускают код обработки событий, например, предоставляемый компонентами Touchable* (например, TouchableHighlight, TouchableOpacity и другими). Насколько я могу судить, нет возможности генерировать нативные события со стороны JS в соответствии с принципами одностороннего потока данных.

С другой стороны, хотя вы можете генерировать произвольные нативные события с нативной стороны, вы не сможете узнать, что делает сторона JavaScript, если вы каким-то образом не проверите данные, отправляемые в методы рендеринга. на стороне коренных жителей, что, вероятно, было бы довольно сложно, если не невозможно.

Поэтому лучший способ сделать это — создать собственный класс представления в нативном коде, который запускает несколько событий касания всякий раз, когда к нему прикасаются, и обернуть его в компонент React Native, как описано в iOS и Android руководства. Однако при этом возникают проблемы:

В iOS нет общедоступного способа для пользовательского кода создавать UITouch объекты и отправлять их в пользовательский интерфейс. Для этого вам нужно использовать нераскрытые методы API, которые могут измениться в любой момент и приведут к отклонению вашего приложения, если вы попытаетесь отправить его в App Store. Есть один способ сделать это, описанный здесь, но он, вероятно, устарел, поскольку Apple не гарантирует, что нераскрытые API останутся стабильными. Там несколько ответы на SO уже о том, почему имитация сенсорных событий на iOS не является хорошей идеей и принесет приложение отклонено.

Для Android это подробно обсуждалось в списке рассылки для платформы Android., при этом общее мнение заключается в том, что не должно быть возможности инициировать произвольные события касания из пользовательского кода. Попытка программно отправить MotionEvents, похоже, приводит к странному и ненадежному поведению, как показано во втором ответе на этот вопрос, последующие комментарии к этому ответу и ответ на этот вопрос.

Даже React Native не создает свои собственные события касания — он просто получает события касания, сгенерированные нативными представлениями. Вся система React Native Gesture Responder просто обертывает общедоступные API, доступные на собственной стороне — API для создания сенсорных событий не является общедоступным.

Все это вместе приводит меня к мысли, что то, что вы хотите сделать, вообще невозможно без использования частных API iOS/Android, скорее всего, из соображений безопасности.

person Pedro Castilho    schedule 16.04.2017
comment
Даже если вы не можете создавать искусственные касания, вы должны иметь возможность напрямую вызывать функции, обрабатывающие события касания, не так ли? - person Viktor Sec; 20.04.2017
comment
Да, вы можете, но в данном случае этого на самом деле недостаточно, потому что карта на самом деле нативный компонент. Вызов обработчиков касаний на самом деле не будет делать то, что хочет пользователь, опубликовавший вопрос, поскольку обработчики касаний могут влиять только на значения на стороне JS, а проблема, которую они хотят решить, находится на нативной стороне. - person Pedro Castilho; 20.04.2017