按钮单击dialogFragment后如何在谷歌地图上添加标记?

Posted

技术标签:

【中文标题】按钮单击dialogFragment后如何在谷歌地图上添加标记?【英文标题】:How do you add a marker on google map after button click on dialogFragment? 【发布时间】:2020-07-19 05:01:42 【问题描述】:

我正在尝试创建一个应用程序,允许用户在地图上发布标记,该标记是他们捕获的图片以及他们设置的标题。但是,在用户单击 dialogFragment 上的帖子后,在我的 android 设备上运行它不会显示标记,它只会在 sydney 上显示一个标记。我将不胜感激任何帮助理解为什么标记没有出现,以及我可以做些什么来修复这个错误。谢谢!

这是我为DialogFragment创建的onView以及用于抓图的activityforresult,这里mMap是MapActivity中定义的GoogleMap

public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 

        if (resultCode == Activity.RESULT_OK) 

            Bitmap bmp = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();

            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            // convert byte array to Bitmap

            image = BitmapFactory.decodeByteArray(byteArray, 0,
                    byteArray.length);

            postImg.setImageBitmap(image);

        
    



  @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    Button post = view.findViewById(R.id.btnDone);
    final EditText popUpName = view.findViewById(R.id.popUpName);
    String title = getArguments().getString("title", "Post Popup");
    final ChipGroup tags = view.findViewById(R.id.chipGroup);
    getDialog().setTitle(title);
    postImg = view.findViewById(R.id.imageView2);
    postImg.setClickable(true);
    popUpName.requestFocus();
    //popUpName.setOnEditorActionListener(this);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    getDialog().getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    postImg.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,
                    CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        
    );
    post.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            final String popUpTitle = popUpName.getText().toString();
            tags.setOnCheckedChangeListener(new ChipGroup.OnCheckedChangeListener() 
                @Override
                public void onCheckedChanged(ChipGroup group, int checkedId) 
                    Chip chip = group.findViewById(checkedId);
                    if (chip != null) 
                        String chipTagSelected = chip.getText().toString();
                    

                    double maxX = 39.333977;
                    double minX = 39.326170;
                    double minY = -76.624140;
                    double maxY = -76.618813;

                    DecimalFormat df = new DecimalFormat(".######");
                    double diffX = maxX - minX;
                    double randomValueX = minX + Math.random() * diffX;

                    double diffY = maxY - minY;
                    double randomValueY = minY + Math.random() * diffY;

                    Marker marker = MapsView.mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(randomValueX, randomValueY))
                            .title(popUpTitle)
                            .icon(BitmapDescriptorFactory.fromBitmap(image)));

                    marker.setTag(0);
                
            );

            //
            //popUpName.getText().toString()
            dismiss();
        
    );


这是我的 DialogFragment xml 文件

<?xml version="1.0" encoding="utf-8"?>

android:layout_
android:layout_>


<TextView
    android:id="@+id/title"
    android:layout_
    android:layout_
    android:layout_marginStart="124dp"
    android:text="Add PopUp"
    app:layout_constraintBottom_toTopOf="@+id/popUpName"
    app:layout_constraintStart_toStartOf="parent" />

<EditText
    android:id="@+id/popUpName"
    android:layout_
    android:layout_
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:hint="Popup Name"
    android:inputType="textCapWords"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/title" />

<Button
    android:id="@+id/btnDone"
    android:layout_
    android:layout_
    android:layout_marginStart="16dp"
    android:layout_marginTop="7dp"
    android:layout_marginEnd="16dp"
    android:text="Post"
    android:backgroundTint="@color/lightBlue"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/chipGroup" />

<TextView
    android:id="@+id/textView"
    android:layout_
    android:layout_
    android:layout_marginTop="12dp"
    android:layout_marginEnd="112dp"
    android:text="Tags"
    android:textAlignment="center"
    android:textSize="24sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/popUpName" />

<com.google.android.material.chip.ChipGroup
    android:id="@+id/chipGroup"
    android:layout_
    android:layout_
    android:layout_marginStart="16dp"
    android:layout_marginTop="7dp"
    android:layout_marginEnd="16dp"
    app:chipSpacing="16dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView"
    app:singleSelection="true"
    >

    <com.google.android.material.chip.Chip
        android:id="@+id/Dog"
        android:layout_
        android:layout_
        android:text="Dog"
        app:chipEndPadding="12dp"
        app:chipStartPadding="12dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>

    <com.google.android.material.chip.Chip
        android:id="@+id/Squirrels"
        android:layout_
        android:layout_
        android:text="Squirrels"
        app:chipEndPadding="12dp"
        app:chipStartPadding="12dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>

    <com.google.android.material.chip.Chip
        android:id="@+id/Bird"
        android:layout_
        android:layout_
        android:text="Bird"
        app:chipEndPadding="12dp"
        app:chipStartPadding="12dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>

    <com.google.android.material.chip.Chip
        android:id="@+id/People"
        android:layout_
        android:layout_
        android:text="People"
        app:chipEndPadding="8dp"
        app:chipStartPadding="8dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>

    <com.google.android.material.chip.Chip
        android:id="@+id/Random"
        android:layout_
        android:layout_
        android:text="Random"
        app:chipEndPadding="8dp"
        app:chipStartPadding="8dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>

    <com.google.android.material.chip.Chip
        android:id="@+id/Animals"
        android:layout_
        android:layout_
        android:text="Animals"
        app:chipEndPadding="8dp"
        app:chipStartPadding="8dp"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        app:chipBackgroundColor="@color/bg_chip_state_list"/>
</com.google.android.material.chip.ChipGroup>

<ImageView
    android:id="@+id/imageView2"
    android:layout_
    android:layout_
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:background="@color/colorPrimary"
    android:clickable="true"
    android:focusable="true"
    app:layout_constraintBottom_toTopOf="@+id/title"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

这是我的 MapActivity onCreate,onMapReady 只是 MapACtivity 的基本实现,标记设置在 sydney

public class MapsView extends FragmentActivity implements OnMapReadyCallback 

public static GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps_view);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    FloatingActionButton fab = findViewById(R.id.add_post);
    fab.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            //Snackbar.make(view, "Here's a Snackbar", Snackbar.LENGTH_LONG)
                   // .setAction("Action", null).show();
            showPostDialog();
        
    );


private void showPostDialog() 
    FragmentManager fm = getSupportFragmentManager();
    PostActivity postFragmentDialog = PostActivity.newInstance("Some title");
    postFragmentDialog.show(fm, "fragment_edit");

    //inal EditText popUpName = findViewById(R.id.popUpName);



/**
 * Manipulates the map once available.
 * This callback is triggered when the map is ready to be used.
 * This is where we can add markers or lines, add listeners or move the camera. In this case,
 * we just add a marker near Sydney, Australia.
 * If Google Play services is not installed on the device, the user will be prompted to install
 * it inside the SupportMapFragment. This method will only be triggered once the user has
 * installed Google Play services and returned to the app.
 */
@Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

【问题讨论】:

【参考方案1】:

您可以从 dilaog 添加以下代码 onClick ,它将在谷歌地图上添加标记。在此之前只需检查 mapReady() 是否成功调用。

   mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener()

    @Override
    public void onMapClick(LatLng destination) 

        MarkerOptions options = new MarkerOptions();
        options.position(destination);
        options.title("Lat=" + destination.latitude + ", Long=" + destination.longitude);
        Marker marker = mGoogleMap.addMarker(options);
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(17));
    
);

【讨论】:

mGoogleMap 是以前定义的 mMap 吗?我添加了这些更改,但不幸的是,单击发布后标记仍然没有出现在地图上。如果对话不包含地图,我也很困惑为什么 onMapClick 会出现在对话中。

以上是关于按钮单击dialogFragment后如何在谷歌地图上添加标记?的主要内容,如果未能解决你的问题,请参考以下文章

怎么在谷歌地图上做标记呀

如何在谷歌地图中一一删除标记?

如何在 Flutter Web 中使用谷歌地图库? [关闭]

在谷歌地图 V2 android studio 中单击 InfoWindowClick 时,如何设置唯一键?

当用户单击关闭按钮关闭 DialogFragment 时出现 IllegalStateException

如何使用 swift 在谷歌地图中更改我的位置按钮的位置