从Google Map的setOnInfoWindowClickListener接口方法替换片段时,UI挂起

时间:2014-04-10 10:53:25

标签: android android-fragments google-maps-markers google-maps-android-api-2

我在我的应用程序中使用谷歌地图并显示标记。

现在点击标记窗口我想用其他片段替换当前片段。

for (StoreData store : comp.getArrStoreList()) {
                LatLng l = new LatLng(Double.parseDouble(store.getLat()),
                        Double.parseDouble(store.getLng()));

                MarkerOptions marker = new MarkerOptions()
                        .position(l)
                        .title(store.getName())
                        .snippet(store.getCity())
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                Marker mrkr = mapCompanyList.addMarker(marker);

                CompanyStoreData companyStoreData = new CompanyStoreData();

                companyStoreData.setStoreData(store);

                companyStoreData.setCompanyId(comp.getId());

                listStoreData.put(mrkr, companyStoreData);


                mapCompanyList
                .setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick(Marker marker) {

                        try {

                            StoreDetailsFragment storeDetails = new StoreDetailsFragment();
                            Bundle b = new Bundle();

                            b.putSerializable(UserDefaults.STORE_OBJECT,
                                    listStoreData.get(marker).getStoreData());
                            b.putString("StoreAppID", listStoreData.get(marker).getCompanyId());

                            storeDetails.setArguments(b);

                            ((BaseTabbarContainer) companyListFragment.getParentFragment()).replaceFragment(
                                    storeDetails, true); // here my UI is hang

                        } catch (Exception e) {
                            Log.e("Exception", "Exception :: " + e.getMessage());
                        }

                    }
                });
            }

我正在创建一个散列图,其中<marker,storedata>标记作为键,而storageata(我的自定义类对象)作为值。

onInfoWindowClick上的

我基于hashmap()的键获取商店数据的实例。它运作良好,但

((BaseTabbarContainer) companyListFragment.getParentFragment()).replaceFragment(
                                        storeDetails, true);  

这里我的UI正在挂起。问题是什么

2 个答案:

答案 0 :(得分:3)

我解决了这个问题。如果有任何人面临这个问题,请参考。

我所做的是创建一个处理程序,在一段时间后运行代码片段,并在调用处理程序后从onInfoWindowClick方法返回返回

mapCompanyList
                .setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick(Marker marker) {

                        final Marker mark = marker;
                        try {

                            new Handler().postDelayed(new Runnable() {

                                @Override
                                public void run() {
                                    callStore(mark);
                                }
                            }, 100);


                            return;
                        } catch (Exception e) {
                            Log.e("Exception", "Exception :: " + e.getMessage());
                        }

                    }
                });

<强> callStore

    private void callStore(Marker marker) {
        StoreDetailsFragment storeDetails = new StoreDetailsFragment();
        Bundle b = new Bundle();

        b.putSerializable(UserDefaults.STORE_OBJECT,
                listStoreData.get(marker).getStoreData());
        b.putString("StoreAppID", listStoreData.get(marker).getCompanyId());

        storeDetails.setArguments(b);

        ((BaseTabbarContainer) CompanyListFragment.this.getParentFragment()).replaceFragment(
                storeDetails, true);

    }

并且有效;

但是我仍然不知道它为什么会挂起以及为什么在运行代码后在onInfoWindowClick方法返回后解决?如果有任何想法请分享。

答案 1 :(得分:2)

我也面临这个问题,对我来说,我通过停止使用fragmentManager.executePendingTransactions()来解决,如果我使用这一行替换片段然后它只是HANG,但没有这条线它没有任何问题。希望它对那些将面临类似问题的人有所帮助。感谢。