Как отформатировать адрес для многострочного отображения?

Аналогично этот вопрос от 2011 года, на который нет удовлетворительного ответа:

Приложение, над которым я работаю, будет развернуто на международном уровне. Само приложение заботится только о широте/долготе Address, но ему нужно будет отображать Address пользователю в многострочном формате. Геокодер Google предоставляет отформатированный адрес, но он находится в одной строке, разделенной запятыми. Для разделения на строки потребуется знание того, как форматируются многострочные адреса в данной стране. В США, например, принято указывать город и штат в одной строке через запятую.

Существует ли встроенный метод (или сторонняя библиотека или веб-служба), который будет форматировать многострочный адрес из Address с учетом того, что адреса с обратным геокодированием могут быть неполными?


person Kevin Krumwiede    schedule 02.10.2015    source источник


Ответы (1)


Ознакомьтесь с googlei18n/libaddressinput: библиотека почтовых адресов Google для Android и Chromium. В проекте два модуля :android и :common. Вам нужно только :common для форматирования адреса для многострочного отображения.

import android.location.Address;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import com.google.i18n.addressinput.common.AddressData;
import com.google.i18n.addressinput.common.FormOptions;
import com.google.i18n.addressinput.common.FormatInterpreter;
...
public static String getFormattedAddress(@NonNull final Address address, 
                                         @NonNull final String regionCode) {
    final FormatInterpreter formatInterpreter
            = new FormatInterpreter(new FormOptions().createSnapshot());
    final AddressData addressData = (new AddressData.Builder()
            .setAddress(address.getThoroughfare())
            .setLocality(address.getLocality())
            .setAdminArea(address.getAdminArea())
            .setPostalCode(address.getPostalCode())
            .setCountry(regionCode) // REQUIRED
            .build());
    // Fetch the address lines using getEnvelopeAddress,
    List<String> addressFragments = formatInterpreter.getEnvelopeAddress(addressData);
    // join them, and send them to the thread.
    return TextUtils.join(System.getProperty("line.separator"),
            addressFragments);
}

ПРИМЕЧАНИЕ: regionCode должен быть допустимым кодом страны iso2, потому что именно из него интерпретатор формата извлекает формат адреса. (См. RegionDataConstants для списка форматов, если вам интересно.)

Устанавливает двухбуквенный код региона CLDR адреса; см. AddressData#getPostalCountry(). В отличие от других значений, передаваемых компоновщику, код региона никогда не может быть нулевым.

Пример: США

801 КАШТАН СТ
СТ. ЛУИ, Миссури, 63101

Пример: JP

〒1600023
НИШИСИНДЗЮКУ
3-2-11 НИШИСИНДЗЮКУ СИНДЗЮКУ-КУ ТОКИО

person Funktional    schedule 03.12.2016
comment
Эта библиотека выглядит очень интересно, но в документации не сказано, как я могу установить ее в свой проект build.gradle, где библиотека доступна и так далее. @Funktional, не могли бы вы рассказать об этом подробнее? - person Sebastien; 22.02.2018
comment
@Sebastien Лично я установил проект как подмодуль git, а затем просто импортировал общую библиотеку, используя: compile project(':libaddressinput') - person Funktional; 27.02.2018