【问题标题】:Can PlaceAutocompleteFragment (overlay mode) be called from inside the Fragment class可以从 Fragment 类内部调用 PlaceAutocompleteFragment(覆盖模式)吗
【发布时间】:2016-06-07 11:11:54
【问题描述】:

我正在我的项目上创建一个带有导航抽屉的活动(扩展 AppCompatActivity),用于在多个片段之间切换,其中一个是带有 MapView 实现的 MapFragment(扩展片段)。 我想在 MapFragment 类中调用 Google 提供的 AutoComplete Widget。

这是我在 MapFragment 类中的代码

    PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)
            getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

    AutocompleteFilter typeFilter = new AutocompleteFilter.Builder()
            .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS)
            .build();
    autocompleteFragment.setFilter(typeFilter);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            String placeDetailsStr = place.getName() + "\n"
                    + place.getId() + "\n"
                    + place.getLatLng().toString() + "\n"
                    + place.getAddress() + "\n"
                    + place.getAttributions();
            Log.i("OnPlaceSelected", placeDetailsStr);
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 15));

        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i("OnPlaceSelected", "An error occurred: " + status);
        }
    });

语法错误发生在

PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

说过

不可转换的类型;无法将“android.support.v4.app.Fragment”转换为“com.google.android.gms.location.places.ui.PlaceAutocompleteFragment”

但是当我将这组代码放在 MainActivity 中时,它工作得很好。 所以我想知道是否有任何方法可以在 Fragment 中调用 AutoComplete 小部件。

任何答案将不胜感激。 :)

【问题讨论】:

    标签: java android-fragments autocomplete widget


    【解决方案1】:

    使用 getActivity()

        PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
    

    【讨论】:

      【解决方案2】:

      如果您尝试从片段中查找片段,则必须使用类似的方法:

      placeAutocompleteFragment = (PlaceAutocompleteFragment)getChildFragmentManager().findFragmentById(R.id.fragmentPlaces);
      

      您可能会遇到未调用 onPlaceSelected 的问题,这是因为您拥有的 Activity 必须将结果转发到片段中。

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

      并且 ma​​pFragment 必须将结果转发到 places 片段:

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

      即使这样,我也遇到了 onPlacesSelected 没有被调用的问题。通常最好不要嵌套地图和地点片段,而只是在拥有的活动中将它们分开。

      【讨论】:

        【解决方案3】:

        我也一直在 interwebz 上搜索,但找不到解决方案,直到我意识到我在 MapFragment 上遇到了同样的问题,所以我应用了该技术并且它奏效了!

        片段:

        private SupportPlaceAutocompleteFragment autocompleteFragment;
        
        public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        
             ...
        
            autocompleteFragment = (SupportPlaceAutocompleteFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
            if(autocompleteFragment==null){
                autocompleteFragment = (SupportPlaceAutocompleteFragment) SupportPlaceAutocompleteFragment.instantiate(context, "com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment");
                autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
                    @Override
                    public void onPlaceSelected(Place place) {
        
                    }
        
                    @Override
                    public void onError(Status status) {
        
                    }
                });
        
                fm.beginTransaction().replace(R.id.autocomplete_fragment, autocompleteFragment).commit();
            }
        
             ...
        

        注意:我使用的是支持片段 (android.support.v4.app.Fragment),这就是我使用 SupportPlaceAutocompleteFragment 的原因

        XML:

        <RelativeLayout
                android:id="@+id/autocomplete_fragment"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        

        【讨论】:

          【解决方案4】:

          你应该使用SupportPlaceAutocompleteFragment而不是PlaceAutocompleteFragment,它在使用Fragment supportv4时被替换

          SupportPlaceAutocompleteFragment autocompleteFragment 
              = (SupportPlaceAutocompleteFragment) 
                  getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
          

          【讨论】:

            【解决方案5】:

            我也有同样的问题,感谢@Kalpesh 的想法,它工作正常,并且没有 eventListenner 的问题,如果它可以帮助某人,这是我的代码。

            我有一个带有 viewpager 和 3 个片段的 tablayout,我们可以向右或向左滑动。

            googlePLacesLayout.xml

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorFragment_bg">
            
            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="0dp"
                android:layout_marginBottom="0dp">
                    <fragment
                        android:id="@+id/autocomplete_fragment"
                        android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="80dp" />
            </android.support.v7.widget.CardView>
            
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Large Text"
                android:id="@+id/largeTexxt"
                android:layout_centerVertical="true"
                android:layout_alignParentStart="true" />
            </RelativeLayout>
            

            MyFragmentClass.java

            package com.raccoon.trash.aregood.TabFragments;
            public class MyFragmentClass extends Fragment {
            
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
            
            }
            
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
            
            final RelativeLayout mRelativeLayout = (RelativeLayout) inflater.inflate(
                        R.layout.googlePLacesLayout, container, false);
            
                PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.autocomplete_fragment);
                autocompleteFragment.setHint("Let's find some restaurants");
            
                final TextView textView = (TextView) mRelativeLayout.findViewById(R.id.largeTexxt);
                autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
                    @Override
                    public void onPlaceSelected(Place place) {
                        textView.setText("Place: " + place.getName()+ place.getId()+
                                place.getAddress()+ place.getPhoneNumber()+ place.getWebsiteUri());
                        System.out.println("Place: " + place.getName()+ place.getId()+
                                place.getAddress()+ place.getPhoneNumber()+ place.getWebsiteUri());
                    }
            
                    @Override
                    public void onError(Status status) {
                        System.out.println("An error occurred: " + status);
                    }
                });
            
            return mRelativeLayout;
            }
            

            }

            【讨论】:

              猜你喜欢
              • 2018-09-07
              • 2016-08-17
              • 1970-01-01
              • 2013-09-26
              • 2012-10-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多