Android v4片段无法转换为PlaceAutocompleteFragment

时间:2016-09-19 06:55:04

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

我正在将Android PlaceAutocompleteFragment功能集成到我的应用中.. 我按照谷歌提供的文档...我已经将xml代码放在我的布局中...当将片段转换为PlaceAutoComplete时,我看到了一个错误.....我的片段扩展了v4片段 import android.support.v4.app.Fragment;

我看到以下错误 getAttribute()

这是我的代码

import android.Manifest;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.text.InputType;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TimePicker;
import android.widget.Toast;

import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlaceAutocompleteFragment;
import com.google.android.gms.location.places.ui.PlaceSelectionListener;
import com.google.maps.GeoApiContext;
import com.google.maps.GeocodingApi;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.LatLng;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import rollwithme.com.rollwithme.R;
import rollwithme.com.rollwithme.Services.CustomLocationManager;
import rollwithme.com.rollwithme.Services.GPSTracker;
import rollwithme.com.rollwithme.Services.LocationValue;
import rollwithme.com.rollwithme.Utils.Constants;
import rollwithme.com.rollwithme.Utils.Utils;

/**
 * A simple {@link Fragment} subclass.
 */
public class PlanFragment extends Fragment implements View.OnFocusChangeListener, View.OnClickListener {

    private static final int PERMISSION_ACCESS_COARSE_LOCATION = 10102;
    private static final String TAG = "PlanFragment";
    Calendar myCalendar = Calendar.getInstance();
    private View fragmentLayout;
    private EditText dateEditText, timeEditText, startEditText, endEditText;
    private ImageButton startCurrent;

    GPSTracker gps;

    public PlanFragment() {
        // Required empty public constructor
    }

    public static PlanFragment newInstance() {
        PlanFragment fragment = new PlanFragment();

        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        fragmentLayout = inflater.inflate(R.layout.fragment_plan, container, false);
        return fragmentLayout;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        checkPermission();

        startCurrent = (ImageButton) fragmentLayout.findViewById(R.id.startCurrent);

        startEditText = (EditText) fragmentLayout.findViewById(R.id.start);
        endEditText = (EditText) fragmentLayout.findViewById(R.id.end);
        dateEditText = (EditText) fragmentLayout.findViewById(R.id.date);
        timeEditText = (EditText) fragmentLayout.findViewById(R.id.time);

        startEditText.setOnFocusChangeListener(this);
        endEditText.setOnFocusChangeListener(this);
        dateEditText.setInputType(InputType.TYPE_NULL);
        timeEditText.setInputType(InputType.TYPE_NULL);

        startCurrent.setOnClickListener(this);

        final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                  int dayOfMonth) {
                // TODO Auto-generated method stub
                myCalendar.set(Calendar.YEAR, year);
                myCalendar.set(Calendar.MONTH, monthOfYear);
                myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                updateDate();
            }

        };

        final TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int i, int i1) {
                timeEditText.setText( i + ":" + i1);
            }
        };

        dateEditText.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //hideKeyboard(dateEditText);
                new DatePickerDialog(getActivity(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });

        timeEditText.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //hideKeyboard(dateEditText);
                new TimePickerDialog(getActivity(), timeSetListener, myCalendar
                        .get(Calendar.HOUR_OF_DAY), myCalendar.get(Calendar.MINUTE), true).show();
            }
        });


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

        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.
                Log.i(TAG, "Place: " + place.getName());
            }

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


    @Override
    public void onFocusChange(View view, boolean b) {
        switch (view.getId()) {
            case R.id.date:
            case R.id.time:
            case R.id.start:
            case R.id.end:
                if (!b) {
                    hideKeyboard(view);
                }
                break;
            default:
                break;
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.startCurrent:
                checkPermission();
//                gps = new GPSTracker(getActivity());
//
//                // check if GPS enabled
//                if(gps.canGetLocation()){
//
//
//                    double latitude = gps.getLatitude();
//                    double longitude = gps.getLongitude();
//
//                    // \n is for new line
//                    Toast.makeText(getActivity(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
//                }else{
//                    // can't get location
//                    // GPS or Network is not enabled
//                    // Ask user to enable GPS/network in settings
//                    gps.showSettingsAlert();
//                }
                break;
            default:
                break;
        }
    }

    private void updateDate() {
        String myFormat = "MM/dd/yy"; //In which you need put here
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

        dateEditText.setText(sdf.format(myCalendar.getTime()));
    }

    public void hideKeyboard(View view) {
        InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }


    void checkPermission() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_ACCESS_COARSE_LOCATION);

        } else  {
            gps = new GPSTracker(getActivity(), getActivity());

            // Check if GPS enabled
            if (gps.canGetLocation()) {

                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();

                // \n is for new line
                GeoApiContext context = new GeoApiContext().setApiKey(Constants.API_KEY_GMAP);
                try {
                    GeocodingResult coding[] = GeocodingApi.newRequest(context).latlng(new LatLng(gps.getLatitude(), gps.getLongitude())).await();
                    startEditText.setText(coding[0].formattedAddress + "");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                // Can't get location.
                // GPS or network is not enabled.
                // Ask user to enable GPS/network in settings.
                gps.showSettingsAlert();
            }
        }
//        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)
//                != PackageManager.PERMISSION_GRANTED) {
//            ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },
//                    PERMISSION_ACCESS_COARSE_LOCATION);
//        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_ACCESS_COARSE_LOCATION:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, yay! Do the

                    // contacts-related task you need to do.

                    gps = new GPSTracker(getActivity(), getActivity());

                    // Check if GPS enabled
                    if (gps.canGetLocation()) {

                        double latitude = gps.getLatitude();
                        double longitude = gps.getLongitude();

                        // \n is for new line
                        //Toast.makeText(getActivity(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                        GeoApiContext context = new GeoApiContext().setApiKey(Constants.API_KEY_GMAP);
                        try {
                            GeocodingResult coding[] = GeocodingApi.newRequest(context).latlng(new LatLng(gps.getLatitude(), gps.getLongitude())).await();
                            startEditText.setText(coding[0].formattedAddress + "");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        // Can't get location.
                        // GPS or network is not enabled.
                        // Ask user to enable GPS/network in settings.
                        gps.showSettingsAlert();
                    }

                } else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.

                    Toast.makeText(getActivity(), "You need to grant permission", Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }

    private void getCurrentLocation() {
        CustomLocationManager.getCustomLocationManager().getCurrentLocation(getActivity(), locationValue);
    }

    public LocationValue locationValue = new LocationValue() {
        @Override
        public void getCurrentLocation(Location location) {
            // You will get location here if the GPS is enabled
            if(location != null) {
                Log.d("LOCATION", location.getLatitude() + ", " + location.getLongitude());
            }
        }
    };

//    @Override
//    public void onResume() {
//        super.onResume();
//
//    }
//
//    @Override
//    public void onDestroy() {
//        super.onDestroy();
////        if (gps != null)
////            gps.stopUsingGPS();
//    }
}

2 个答案:

答案 0 :(得分:3)

我已经解决了Mike M.评论中的问题。

必须使用SupportPlaceAutocompleteFragment而不是PlaceAutoComplete

由于

答案 1 :(得分:0)

对于较旧的平台使用SupportPlaceAutoCompleteFragment,我在下面添加了示例代码,请确保在gradle中添加Google地方 在app gradle中

  

compile' com.google.android.gms:play-services-places:10.0.0'

现在在你的片段中:

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

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i(TAG, "Place: " + place.getName());
        }

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