Search code examples
androidgoogle-mapsandroid-fragmentsandroid-alertdialogandroid-dialogfragment

Unable to perform fragment transactions inside alert dialog in android


I have a fragment in which I had google map.I am trying to keep this fragment inside an alert dialog. But it is not accepting in any way.

First of all it is not letting me to allow v4 fragment inside a dialog. I even tried to pass that v4 fragment object through constructor.

Iam getting an error saying that that activity should not have a constructor !! How frustrating is this !!

Here is my fragment code :

package com.motowala.AfterLogin;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.acs.R;


public class MapDialogFragment extends Fragment implements OnMapReadyCallback {

    View v;
    MapView googleMapView;
    GoogleMap googleMap;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.google_map_fragment, container, false);
        return v;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        googleMapView=(MapView)v.findViewById(R.id.google_map_view);
        googleMapView.onCreate(null);
        googleMapView.onResume();
        googleMapView.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        MapsInitializer.initialize(getActivity());
        this.googleMap=googleMap;
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.addMarker(new MarkerOptions().position(new LatLng(16,80)));
    }
}

The code that I've used for fragment layout is this

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.acs.AlertAndProgressDialogs.GoogleMapLocationPicker"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.gms.maps.MapView
        android:id="@+id/google_map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </com.google.android.gms.maps.MapView>
</FrameLayout>

The code that I've used for alert dialog is this :

package com.acs.AlertAndProgressDialogs;

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import com.google.android.gms.maps.MapView;
import com.acs.AfterLogin.MapDialogFragment;
import com.acs.R;


public class GoogleMapLocationPicker extends DialogFragment {

    View layout;
    MapView mapView;
    MapDialogFragment googleMapFragment;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = getActivity().getLayoutInflater();
        layout = inflater.inflate(R.layout.google_map_frag_dialog, null);
        googleMapFragment=new MapDialogFragment();
        FragmentManager manager=getActivity().getFragmentManager();
        FragmentTransaction transaction=manager.beginTransaction();
        transaction.replace(R.id.map_replacable_frag,googleMapFragment);



    /* This is where I'm ending with error. It is saying it requires a fragment 
    object but it found object of type MapDialogFragment. 
    I have even tried using getChildFragmentManager() even that is also not 
    working at here.*/


    }
}

Thanks a lot in advance...


Solution

  • Well I found a solution to your problem..Tested and it is working.

    Here is the code:

    public class GoogleMapLocationPicker extends DialogFragment implements OnMapReadyCallback {
    
        View layout;
        MapView mapView;
        GoogleMap googleMap;
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            LayoutInflater inflater = getActivity().getLayoutInflater();
            layout = inflater.inflate(R.layout.google_map_frag_dialog, null);
            mapView = (MapView) layout.findViewById(R.id.google_map_view);
            AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
            builder.setView(layout);
            return builder.create();
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mapView.onCreate(null);
            mapView.onResume();
            mapView.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            Toast.makeText(getActivity(), "Map ready...", Toast.LENGTH_SHORT).show();
            MapsInitializer.initialize(getActivity());
            this.googleMap=googleMap;
            googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
            googleMap.addMarker(new MarkerOptions().position(new LatLng(16,80)));
        }
    }
    

    This dialog comes readily with a map in it. Hope this helps :)