简体   繁体   English

将选择器加载到较长位置,变量无法正确更改

[英]Place Picker loads to long, variables don't change correctly

I'm making a simple place picker program in android. 我正在用android做一个简单的地方选择器程序。 I want to save some text when user choose a point on map with place picker. 当用户使用地点选择器在地图上选择一个点时,我想保存一些文本。 And the problem is when I click on button the place picker opens too long and variable which is responsible for place can't keep up change and dialog that responses for enter text never opens. 问题是,当我单击按钮时,位置选择器打开的时间过长,导致位置变化的变量无法跟上更改,并且输入文本的响应对话框也永远不会打开。 I think, maybe problem is with threads, isn't it? 我认为,也许问题出在线程上,不是吗?

MapsActivity.java 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 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();
    }
}

Please help me, what could go wrong? 请帮助我,可能会出什么问题?

Your problem is that the Place Picker communicates with your main activity asynchronously, so you're opening your dialog before it returns. 您的问题是,地点选择器与您的主要活动异步进行通信,因此您需要在对话框返回之前打开它。 Try waiting until Place Picker has returned before opening the dialog like so: 尝试等待直到位置选择器返回,然后再打开对话框,如下所示:

.
.
.
@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();
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM