将Picker Picker加载到long,变量无法正确更改

时间:2017-11-22 04:05:54

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

我在android中制作一个简单的地方选择程序。当用户使用地方选择器在地图上选择一个点时,我想保存一些文本。问题是,当我点击按钮时,地点选择器打开的时间太长而且负责地方的变量无法跟上输入文本的响应永远不会打开的变化和对话框。我想,也许问题在于线程,不是吗?

MapsActivity.java

package com.example.kirill.myapplication;

import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlacePicker;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;


public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, View.OnClickListener {

private static final int PLACE_PICKER_REQUEST = 1;
private GoogleMap mMap;
private Button addEventBtn;
private PlacePicker.IntentBuilder builder;
private Place place;

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.AddEventButton:
            place = null;
            callPlacePicker();
            if (place != null) {
                openDialog();
            }
            break;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    addEventBtn = (Button) findViewById(R.id.AddEventButton);
}

@Override
public void onMapReady(GoogleMap googleMap){
    mMap = googleMap;
    LatLng sydney = new LatLng(-34, 151);
    Marker marker = mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    addEventBtn.setOnClickListener(this);
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PLACE_PICKER_REQUEST) {
        if (resultCode == RESULT_OK) {
            place = PlacePicker.getPlace(this, data);
        }
    }
}


public void openDialog() {
    DialogEventCreate dialogEventCreate = new DialogEventCreate();
    dialogEventCreate.show(getSupportFragmentManager(), "dialog Event Create");
}


public void callPlacePicker() {
    builder = new PlacePicker.IntentBuilder();
    try {
        startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

DialogEventCreate.java

package com.example.kirill.myapplication;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;


public class DialogEventCreate extends AppCompatDialogFragment {

private EditText editEventName;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.layout_dialog, null);

    builder.setView(view)
            .setTitle("Create Event")
            .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            })
            .setPositiveButton("create", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });

    editEventName = view.findViewById(R.id.editEventName);
    return builder.create();
    }
}

请帮助我,可能出现什么问题?

1 个答案:

答案 0 :(得分:0)

你的问题是Place Picker是异步地与你的主活动进行通信,因此你在返回之前打开对话框。尝试等到Place Picker返回后再打开对话框,如下所示:

.
.
.
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.AddEventButton:
            place = null;
            callPlacePicker();
            break;
    }
}
.
.
.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PLACE_PICKER_REQUEST) {
        if (resultCode == RESULT_OK) {
            place = PlacePicker.getPlace(this, data);
            openDialog();
        }
    }
}