【问题标题】:OnPlaceSelectedListener of SupportPlaceAutocompleteFragment not fired inside ViewPagerSupportPlaceAutocompleteFragment 的 OnPlaceSelectedListener 未在 ViewPager 内触发
【发布时间】:2015-12-29 08:57:29
【问题描述】:

我的应用程序有一个 viewPager 和 4 个片段的活动。 在一个片段中,我添加了一个 google SupportPlaceAutocompleteFragment

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.area_swipe_fragment, container, false);



    SupportPlaceAutocompleteFragment autocompleteFragment = (SupportPlaceAutocompleteFragment)
            getChildFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            Toast.makeText(ctx, "do something", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Status status) {
        }
    });






    return view;
}

我的问题是 onPlaceSelectedListener 从未被解雇,我无法获得所选地点的结果。而是将onActivityResults() 放在第二个片段中。 我尝试在第一个片段中使用onActivityResults(),但它没有被触发,总是在第二个片段中执行。

有什么想法吗?

【问题讨论】:

    标签: android android-viewpager google-places-api


    【解决方案1】:

    来自the docs

    如果您的片段嵌套在另一个片段中,您的应用还必须 将 onActivityResult() 调用转发到包含的片段,如图所示 在下面的sn-p中:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        autocompleteFragment.onActivityResult(requestCode, resultCode, data);
    }
    

    也许这就是解决方案。

    【讨论】:

    • 从包含的片段中覆盖 onActivityResult 仍然不起作用,因为 PlaceSelectionListener 在我的代码中仍然没有被触发。因此,我通过覆盖容器活动中的 onActivityResult 并从那里调用片段的 onActivityResult 找到了一种解决方法。即使使用此解决方案,PlaceSelectionListener 也不会被触发,因此我已将代码放置在选择包含片段的覆盖 onActivityResult 中的地址后执行。
    • 您的 ViewPager 是否也包含在 Fragment 中?您需要通过嵌套片段的每一级转发 onActivityResult(...) 调用。
    • 不,ViewPager 包含在 Activity 中。在 ViewPager 中有一些片段,其中之一包含 SupportPlaceAutocompleteFragment。
    【解决方案2】:

    @AndrewR 的回答让我走上了正确的道路,与 cmets 非常相似,我覆盖了 onActivityResult 但它没有用。

    问题是主机Activity 没有调用super

    public class HostActivity extends AppCompatActivity {
    
        //Please don't forget other relevant methods
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //super.onActivityResult... is the important line
            //Add other custom behaviours
        }
    }
    

    【讨论】:

      【解决方案3】:

      假设为您的 api 密钥正确启用了适用于 android 服务的 Google Places API,即使我在使用 SupportPlaceAutocompleteFragment 时也观察到类似的问题,其中 onPlaceSelected 永远不会在地点选择时触发。但是后来当我尝试使用意图方法时,一切都奏效了..

      【讨论】:

        【解决方案4】:

        我今天早上遇到了这个问题,经过大量阅读和随机的类似问题后,我得到了以下工作。

        如果您查看 SupportPlaceAutocompleteFragment 的源代码,您会看到它调用了

        public class SupportPlaceAutocompleteFragment extends Fragment {
            private void zzzG() {
                ...
                try {
                    Intent var2 = (new IntentBuilder(2)).setBoundsBias(this.zzaRk).setFilter(this.zzaRl).zzeq(this.zzaRj.getText().toString()).zzig(1).build(this.getActivity());
                    this.startActivityForResult(var2, 1);
                }
                ...
            }
        
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                if(requestCode == 1) {
                    ...
                }
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
        

        根据您的集成,这可能会导致 RequestCode 更改为 1 以外的值。通过将其扩展为覆盖 startActivityForResult,您可以通过调用 getActivity().startActivityForResult 而不是 this.startActivityForResult 来更改行为

        public class WrappedSupportPlaceAutocompleteFragment extends SupportPlaceAutocompleteFragment {
        @Override
        public void startActivityForResult(Intent intent, int requestCode) {
            this.getActivity().startActivityForResult(intent, requestCode);
        }
        

        }

        从那里您现在可以按照 AndrewR 提到的内容将活动结果从活动传递到片段并获得预期结果。

        【讨论】:

          猜你喜欢
          • 2016-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-24
          • 1970-01-01
          • 2015-04-16
          相关资源
          最近更新 更多