文档管理中心
我的

Widget

概览

widget是内置地点搜索建议功能的搜索组件。当用户在搜索框输入搜索词时,组件会显示一个可供选择的预测地点列表,当用户选择列表中任意一项时,会返回一个Site对象,然后您的应用可以使用该对象获取所选地点的详细信息。

有两种方式可以在您的应用中使用搜索组件:

  • 方式一:添加SearchFragment。
  • 方式二:使用Intent启动搜索组件。
注意

使用时需在应用级的build.gradle文件中,在"dependencies"里添加如下编译依赖,如果未添加将会报错:implementation 'androidx.recyclerview:recyclerview:1.1.0'。API密钥是您在华为开发者联盟创建应用时生成的API密钥,注意使用时需要调用URLEncoder.encode("Your apiKey", "UTF-8")方法对API密钥进行encodeURI编码。

添加SearchFragment

通过SearchFragment将搜索组件添加到您的应用中,请执行以下步骤:

  1. 将SearchFragment添加到Activity中。请在Activity的XML布局中添加一个fragment元素,例如:

     <fragment
            android:id="@+id/widget_fragment"
            android:name="com.huawei.hms.site.widget.SearchFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

  2. 给SearchFragment添加侦听器。将SearchFragment绑定到Activity中,并添加搜索结果列表项的侦听器SiteSelectionListener,当用户点击任意搜索结果时,会返回被点击的Site对象。完整示例请参见SearchFragmentActivity.java。

    示例代码如下:
    Java
    Kotlin
    SearchFragment fragment = (SearchFragment) getSupportFragmentManager().findFragmentById(R.id.widget_fragment);
    // 设置SearchFragment的API key
    fragment.setApiKey("API key"); 
    fragment.setOnSiteSelectedListener(new SiteSelectionListener() {
                @Override
                public void onSiteSelected(Site data) {
                    Toast.makeText(getApplication(), data.getName(), Toast.LENGTH_LONG).show();
                }
                @Override
                public void onError(SearchStatus status) {
                    Toast
                        .makeText(getApplication(), status.getErrorCode() + "\n" + status.getErrorMessage(),
                            Toast.LENGTH_LONG)
                        .show();
                }
    });
    val fragment: SearchFragment = supportFragmentManager.findFragmentById(R.id.widget_fragment) as SearchFragment
    // 设置SearchFragment的API key
    fragment.setApiKey("API key")
    fragment.setOnSiteSelectedListener(object : SiteSelectionListener {
        override fun onSiteSelected(data: Site) {
            Toast.makeText(application, data.getName(), Toast.LENGTH_LONG).show()
        }
        override fun onError(status: SearchStatus) {
            Toast
                    .makeText(application, status.getErrorCode() + "\n" + status.getErrorMessage(),
                            Toast.LENGTH_LONG)
                    .show()
        }
    })

    图1和图2分别展示了搜索框和搜索结果列表:

    图1 搜索框
    图2 搜索结果列表

使用Intent启动搜索组件

使用Intent启动搜索组件,请按照以下步骤操作:

  1. 创建SearchIntent对象,并设置SearchIntent的API密钥。

    示例代码如下:
    Java
    Kotlin
    private SearchIntent searchIntent;
    searchIntent = new SearchIntent();
    searchIntent.setApiKey("API key"); 
    private val searchIntent = SearchIntent()
    searchIntent.setApiKey("API key")

  2. 创建Intent对象,使用startActivityForResult(Intent intend, int requestCode)启动SearchIntent。

    示例代码如下:
    Java
    Kotlin
    Intent intent = searchIntent.getIntent(this);
    startActivityForResult(intent, SearchIntent.SEARCH_REQUEST_CODE);
    val intent = searchIntent.getIntent(this)
    startActivityForResult(intent, SearchIntent.SEARCH_REQUEST_CODE)

  3. 重写Activity的onActivityResult(int requestCode, int resultCode, Intent data),并调用父类的onActivityResult(requestCode, resultCode, data)方法。被点击的Site对象可以从回传的Intent对象中获取。完整示例请参见SearchIntentActivity.java。

    示例代码如下:
    Java
    Kotlin
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    	super.onActivityResult(requestCode, resultCode, data);
    	if (SearchIntent.SEARCH_REQUEST_CODE == requestCode) {
    		if (SearchIntent.isSuccess(resultCode)) {
    			Site site;
    			site = searchIntent.getSiteFromIntent(data);
    			Toast.makeText(getApplication(), site.getName(), Toast.LENGTH_LONG).show();
    		}
    	}
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (SearchIntent.SEARCH_REQUEST_CODE == requestCode) {
            if (SearchIntent.isSuccess(resultCode)) {
                val site: Site = searchIntent.getSiteFromIntent(data)
                Toast.makeText(application, site.getName(), Toast.LENGTH_LONG).show()
            }
        }
    }

限制地点搜索建议结果

SearchFragment和SearchIntent都可以通过setFilter(SearchFilter)限制搜索建议结果,此时需要创建SearchFilter对象来设置限制条件,如下表所示。

展开

接口

描述

setQuery(String query)

设置搜索关键字。

setLocation(Coordinate location)

设置搜索结果偏向的经纬度。

setRadius(Integer radius)

设置搜索半径,单位:米。取值范围:[1, 50000],默认50000米。

setBounds(CoordinateBounds bounds)

设置搜索结果偏向的范围。

setCountryCode(String countryCode)

设置在指定国家内搜索,采用ISO 3166-1 alpha-2。

setLanguage(String language)

设置搜索结果返回的语言,取值范围参见支持的语言的语种代码。如果不指定语种,返回英语,如果没有英语,返回当地语言。

setPoiType(List<LocationType> poiType)

设置返回地点的POI类型。取值范围是LocationType的子集,包括GEOCODE、ADDRESS、ESTABLISHMENT、REGIONS、CITIES五种类型。

setPoliticalView(String politicalView)

设置政治观点。

注意

该接口已废弃。

setChildren(boolean children)

设置是否返回子节点。

setStrictBounds(Boolean strictBounds)

设置是否严格限制在Bounds内搜索,默认值为false。