• Stars
    star
    281
  • Rank 142,006 (Top 3 %)
  • Language
    Java
  • License
    BSD 2-Clause "Sim...
  • Created almost 9 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An address-autocompleting text field for Android

android-PlacesAutocompleteTextView

Build Status Android Arsenal

An AutocompleteTextView that interacts with the Google Maps Places API to provide location results and caches selected results in a history file for later use

gif

Installing

The PlacesAutocompleteTextView is available from the sonatype snapshots repository. Use the following in your build.gradle:

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}

dependencies {
    compile 'com.seatgeek:placesautocomplete:0.3-SNAPSHOT'
}

Basic setup and usage

  1. You'll need a Google Server API key for you application. There are instructions on how to set up your API project and generate a key here

  2. Your application will need the android.permission.INTERNET permission in its manifest for the View to interact with the Google Maps API

  3. With your API key, you're ready to add the PlacesAutocompleteTextView to your layout xml:

    <com.seatgeek.placesautocomplete.PlacesAutocompleteTextView
       android:id="@+id/places_autocomplete"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       app:pacv_googleMapsApiKey="<YOUR_GOOGLE_API_KEY>"/>
  4. Finally, you'll likely want a listener in your UI to know when the user has selected an item from the dropdown:

    placesAutocomplete.setOnPlaceSelectedListener(
           new OnPlaceSelectedListener() {
               @Override
               public void onPlaceSelected(final Place place) {
                  // do something awesome with the selected place
               }
           }
    );
  5. That's it!

Note: you can treat the PlacesAutocompleteTextView the same as any AutocompleteTextView as it extends from the framework AutocompleteTextView. This means you can use custom styles with all the standard view properties.

Advanced usage/customization

XML properties

There are a few XML properties that can control some of the functionality of the autocomplete view:

xml property java method description
pacv_historyFile setHistoryManager() By default, the PlacesAutocompleteTextView will save the history of the selected Place's in a file on the file system. This is great for cases when your user may be typing in the same address in different parts of your UI or across different sessions. If you'd like to simply change the location of the file on the filesystem, you can specify the path string here. By default, the file is stored in the application cache dir under autocomplete/pacv_history.json. If this is a feature that you'd like to disable, you can set the property in xml to @null or call setHistoryManager(null).
pacv_resultType setResultType() The Places API can return various types of Places depending on what your application is looking to allow the user to select. By default, the PlacesAutocompleteTextView only requests items of type address, which returns locations associated with a full postal address, public or residential. You can change this to also be geocode for any address or establishment for non-residential addresses
pacv_adapterClass setAdapter() If you don't like the default Adapter for displaying the items in the dropdown list (it is pretty basic by default), you can override it by specifying your own in xml (by passing the fully-qualified classname) or using setAdapter(). An important note: because of how the filtering functionality works in the PlacesAutocompleteTextView, your custom adapter must extend AbstractPlacesAutocompleteAdapter.
pacv_clearEnabled showClearButton() Show the typicall X button to the right of the PlacesAutocompleteTextView to let user clear the text. Defaults to false. Other methods for controlling the clear button is setImgClearButton() Override the default Clear image and add your own, setOnClearListener() Override the clear listener like what should happen when the X is pressed, default is clear text, showClearButton() show/hide it.

Need more details? PlaceDetails

One of the requirements of our usage of this view was autofilling the payment and shipping addresses in our checkout flow. By default, the returned Place from the Google Maps API doesn't have the full set of address components (city, state, postal, street address, etc.) and instead provides it "conveniently" in a human readable string like "235 Park Ave South, New York, NY 10003". Which is probably pretty tricky to parse to get the address components. Enter the "Place Details" API. The PlacesAutocompleteTextView provides a helper method getDetailsFor(Place, DetailsCallback) that you can use to easily fetch the extra details that you might need. The PlaceDetails object has a lot more than just address components as well, so if you're building a complex UI around a location, this is probably the API call that you'll need to make.

If you have concerns about configuration changes while the details request is in-flight, you can grab the instance of the PlacesApi from PlacesAutoCompleteTextView#getApi() and manage the details request yourself.

See the example project for this API in use.

Getting stylish

The PlacesAutocompleteTextView is styleable using the pacv_placesAutoCompleteTextViewStyle global style attribute. The style should extend from PACV.Widget.PlacesAutoCompleteTextView to get the default style's parameters, e.g.:

styles.xml:

        <style name="Widget.PlacesAutoCompleteTextView.Styled"
               parent="PACV.Widget.PlacesAutoCompleteTextView">
            <item name="android:background">@drawable/my_edit_text_background</item>
            <item name="android:textAppearance">@style/MyTextAppearance</item>
        </style>

themes.xml:

        <style name="AppTheme" parent="@style/YourParentStyle">
            <item name="pacv_placesAutoCompleteTextViewStyle">@style/Widget.PlacesAutoCompleteTextView.Styled</item>
        </style>

Location biasing

A common thing that you might want to do is bias the place results to the location of the user. By default, the PlacesAutocompleteTextView will bias the results by a geoip lookup of the device's IP address. If your app has different requirements for where you want to bias the address results to or you want more accuracy than a geoip lookup, you can pass an Android Location into the PlacesAutocompleteTextView using the #setCurrentLocation() method.

You can tweak the biasing radius by using the setRadiusMeters(Long) method.

If you'd like to disable biasing completely, you can setLocationBiasEnabled(false)

Purpose and "why not use Google Play Services?"

This project was started internally before the Places API was released on Google Play Services and we needed a way to make entering your payment and shipping addresses in our Android app easier. The reason that this project is still alive and hasn't migrated to Google Play Services is twofold:

  1. It's still impossible to fetch the full PlaceDetails from the Google Play Services implementation [ref], without which you cannot get the full breakdown of address components
  2. It handles hooking the UI components to the data for you to accelerate your development process. With Google Play Services you still need to create your own FilterAdapter, AutocompleteTextView, etc.

Contributing

  1. Fork this repo and clone your fork
  2. Make your desired changes
  3. Add tests for your new feature and ensure all tests are passing
  4. Commit and push
  5. Submit a Pull Request through Github's interface and a project maintainer will decide your change's fate.

Note: issues can be submitted via github issues

License

PlacesAutocompleteTextView is released under a BSD 2-Clause License, viewable here

More Repositories

1

fuzzywuzzy

Fuzzy String Matching in Python
Python
9,067
star
2

react-infinite

A browser-ready efficient scrolling container based on UITableView
JavaScript
2,714
star
3

thefuzz

Fuzzy String Matching in Python
Python
2,460
star
4

soulmate

Unmaintained, use Soulheart!
Ruby
1,061
star
5

SGImageCache

A flexible image caching library for image rich iOS applications
Objective-C
401
star
6

djjob

PHP port of delayed_job, a database backed asynchronous priority queue
PHP
253
star
7

hashi-helper

Disaster Recovery and Configuration Management for Consul and Vault
Go
184
star
8

nomad-helper

Useful tools for working with @hashicorp Nomad at scale
Go
157
star
9

docker-mirror

Mirror docker images across image repositories
Go
140
star
10

nomad-firehose

Firehose all nomad job, allocation, nodes and evaluations changes to rabbitmq, kinesis or stdout
Go
115
star
11

bash-aptfile

A simple method of defining apt-get dependencies for an application
Shell
89
star
12

businesstime

A simple python utility for calculating business time aware timedeltas between two datetimes
Python
85
star
13

react-slider

DEPRECATED: A Slider in React
JavaScript
80
star
14

docker-build-cacher

Builds a service with docker and caches the intermediate stages
Haskell
53
star
15

druzhba

Python
36
star
16

conductor

A data-backed adwords campaign bidder
Python
25
star
17

backstage-plugins

SeatGeek Backstage Plugins Collection
TypeScript
25
star
18

haldane

a friendly http interface to the aws api
Python
23
star
19

dhall-nomad

Create maintainable nomad job files
Dhall
22
star
20

SGHTTPRequest

Objective-C
17
star
21

aws-dynamic-consul-catalog

Keep your Consul service catalog in sync with your RDS instances
Go
16
star
22

tornado-async-transformer

libcst transformer that replaces tornado's legacy @gen.coroutine syntax with python3.5+ native async/await
Python
15
star
23

amqp-dispatcher

A daemon to run AMQP consumers
Python
14
star
24

statsd_rb

DEPRECATED. Use https://github.com/etsy/statsd instead of this.
Ruby
13
star
25

hell

Deprecated: Hell is an open source web interface that exposes a set of capistrano recipes as a json api, for usage within large teams
JavaScript
12
star
26

redis-health

Can be used to check the health of your Redis instance.
Go
12
star
27

SGAPI

The SG Api SDK for iOS
Objective-C
11
star
28

SGListAnimator

Provides animated transitions for your table and collection views, so you don't have to resort to calling `reloadData`.
Objective-C
10
star
29

api-support

A support channel for the SeatGeek Platform
8
star
30

react-select-option

A plain <select> component that can be styled.
JavaScript
8
star
31

circus-logstash

A Circus logger for shipping logs to Logstash
Python
6
star
32

nomad-crashloop-detector

detect Nomad allocation crash-loops, by consuming the allocation stream from nomad-firehose
Go
5
star
33

gramo

Kotlin
5
star
34

datadog-service-helper

use consul catalog to manage datadog service checks
Go
4
star
35

wrecker-ui

An HTML interface for wrecker, the load testing tool
Elm
4
star
36

graceful_listener

net.Listener implementation for graceful shutdown
Go
4
star
37

sgcli

A command-line interface for SeatGeek
Python
4
star
38

logrus-gelf-formatter

Formats logrus messages in the GELF JSON format
Go
3
star
39

geocoder-java

Fork of https://code.google.com/p/geocoder-java/
Java
3
star
40

homebrew-formulae

Custom SeatGeek Formula for Homebrew
Ruby
3
star
41

k8s-reconciler-generic

A generic Kubernetes reconciler abstraction based on kubebuilder
Go
3
star
42

sgmods-go

Codemods for golang from SeatGeek.
Go
1
star
43

api-intro-presentation

1
star
44

greenhouse-api-client

Kotlin
1
star
45

seatgeek-emea-ios-sdk

Swift
1
star
46

elastic-search-health

Go
1
star
47

vault-stress

Go
1
star
48

sfn-stack-profile

Ruby
1
star
49

eslint-config-seatgeek-react-standard

React rules specific to the SeatGeek repositories.
JavaScript
1
star