Places SDK for Android:如何验证 AutocompleteSupportFragment 是不是为空?

Posted

技术标签:

【中文标题】Places SDK for Android:如何验证 AutocompleteSupportFragment 是不是为空?【英文标题】:Places SDK for Android: How to validate AutocompleteSupportFragment is not empty?Places SDK for Android:如何验证 AutocompleteSupportFragment 是否为空? 【发布时间】:2020-03-30 23:49:12 【问题描述】:

我在 AlertDialog 中添加了一个 AutocompleteSupportFragment。AlertDialog 我想确保用户单击“创建”按钮后位置字段不为空。 (就像我如何确保其他字段不为空一样。)Fields validation 我希望有类似 setOnPlaceUnselectedListener 的东西。但是 AutocompleteSupportFragment 只有 setOnPlaceSelectedListener,这并不理想,因为它不知道用户是否输入了某个位置然后清除输入。

AutocompleteSupportFragment 确实有一个 setText 方法来设置要在搜索输入字段中显示的文本。但是好像没有对应的getText方法。

是否有验证 AutocompleteSupportFragment 是否选择了 Place 或是否为空? .xml

<fragment android:id="@+id/create_event_location_frag"
                    android:layout_
                    android:layout_
                    android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment" />

Activity.java


autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() 
            @Override
            public void onPlaceSelected(Place place) 
                // Updating my class variables here doesn't help. 
                // If user first selects a place, then clears it and click "Create", 
                // I won't know that the location field is empty.
                Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            

            @Override
            public void onError(Status status) 
                Log.i(TAG, "An error occurred: " + status);
            
        );

【问题讨论】:

【参考方案1】:

您的理解是正确的,目前没有“setOnPlaceUnselectedListener”或“getText”或任何其他通过 Places SDK 的方法可以帮助您验证输入是否为空。

但是,在 Google 的问题跟踪器中公开onClearListener() 的相关功能请求,我建议加星以增加可见性并订阅通知:

https://issuetracker.google.com/issues/35828573

此外,在其中一个 cmets 中提到了一个“hack”或解决方法来获取清除按钮的 View。请注意,对于 AutocompleteSupportFragment,按钮的 id 是 places_autocomplete_clear_button

例如,你可以创建一个类变量:

private String selectedPlace = null;

并将其用作选择或取消选择地点的标志。

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() 

        @Override
        public void onPlaceSelected(Place place) 
            selectedPlace = place.getName();
        

        @Override
        public void onError(Status status) 
            selectedPlace = null;
        

    );

    View clearButton = autocompleteFragment.getView().findViewById(R.id.places_autocomplete_clear_button);
    clearButton.setOnClickListener(view -> 
        autocompleteFragment.setText("");
        selectedPlace = null;
    );

    final Button button = findViewById(R.id.button_id);
    button.setOnClickListener(v -> 
        if (selectedPlace == null) 
            Toast.makeText(getApplicationContext(), "Location cannot be empty", Toast.LENGTH_LONG).show();
        
    );

我已经对此进行了测试,因此我可以确认它有效,我希望它也可以帮助你!

【讨论】:

onClearListener() 正是我所需要的!我已经盯着这个问题了——不敢相信它被标记为 p4。非常感谢您的解决方法 - 它确实有效! 很高兴听到并乐于提供帮助! :) 我在尝试您建议的 hack 时遇到此错误。 Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 您能发布您的(可重现的)代码吗?最好在一个新问题中。我去看看。【参考方案2】:

我已经回答了这个here。您可以在片段中找到清除按钮并收听。

autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() 
    @Override
    public void onPlaceSelected(Place place) 
        homeAddressPlaceID = place.getId();
        Log.i(TAG, "Place: " + place.getName() + ", " + place);

        autocompleteFragment.getView().findViewById(R.id.places_autocomplete_clear_button)
                .setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View view) 
                        autocompleteFragment.setText("");
                        homeAddressPlaceID = "";
                    
                );
    

    @Override
    public void onError(Status status) 
        Log.i(TAG, "An error occurred: " + status);
    
);

之后,你可以检查homeAddressPlaceID是否为空。

【讨论】:

以上是关于Places SDK for Android:如何验证 AutocompleteSupportFragment 是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

适用于 android 的 Google 地图和 Places SDK 在发行版 APK 中不工作

Places SDK 中的 APIException 9011 和 9010 错误

Places for Android API 已弃用替代方案

android studio log errr Places API for Android 似乎没有为您的应用启用。它打开和关闭

Google Places Android 显示错误“地点字段不得为空”?

AndroidStudio - 程序类型已经存在:com.google.android.gms.location.places.zza