2016-05-23 2 views
1

Я хочу добавить простой GoogleMap в этот фрагмент.Android - Как добавить карту Google в этот фрагмент?

package se.adrianhansson.runpoint; 

import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.maps.CameraUpdateFactory; 
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.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link HomeFragment.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link HomeFragment#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class HomeFragment extends Fragment implements View.OnClickListener { 
    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private Button buttonStart; 
    private View view; 

    private OnFragmentInteractionListener mListener; 

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

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment HomeFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static HomeFragment newInstance(String param1, String param2) { 
     HomeFragment fragment = new HomeFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     view = inflater.inflate(R.layout.fragment_home, container, false); 
     buttonStart = (Button) view.findViewById(R.id.buttonHomeStart); 
     return view; 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    //public void onButtonPressed(Uri uri) { 
    public void onButtonPressed(String string){ 
     if (mListener != null) { 
      //mListener.onFragmentInteraction(uri); 
      mListener.onFragmentInteractionHome(string); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    //no more use?? 
    @Override 
    public void onClick(View v) { 
     mListener.onFragmentInteractionHome("Clicked"); 
//  switch (v.getId()) { 
//   case R.id.buttonHomeStart: 
//    mListener.onFragmentInteractionHome("Clicked start"); 
//    break; 
//  } 
    } 

    /** 
    * This interface must be implemented by activities that contain this 
    * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p/> 
    * See the Android Training lesson <a href= 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteractionHome(String string); 
    } 
} 

А вот мой XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="se.adrianhansson.runpoint.HomeFragment"> 

    <!-- TODO: Update blank fragment layout --> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:text="@string/hello_blank_fragment" /> 

     <Button 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="New Button" 
      android:id="@+id/buttonHomeStart" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" 
      android:layout_marginRight="10dp" 
      android:layout_marginLeft="10dp" 
      android:backgroundTint="@color/colorPrimary" 
      android:nestedScrollingEnabled="false" /> 
    </RelativeLayout> 

</FrameLayout> 

Я попробовал миллион различных способов. Я следил за учебниками, пытался скопировать и изменить свой собственный код (который я перенес из Activity, но, видимо, это не работает с одними и теми же фрагментами i). Я получаю множество ошибок, и мое приложение всегда срабатывает во всех моих попытках, независимо от того, что я пытаюсь сделать. Итак, здесь добавлен «чистый сланец» моего фрагмента. Теперь .. как добавить карту Google к этому?

Так что я надеюсь, что кто-то здесь может мне помочь. Как добавить простую карту Google в качестве «фона» в моем фрагменте?

ответ

2

При условии, что вы активировали API Карт и приобрели ключ из консоли разработчика, добавьте MapView к текущему макету фрагмента:

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

убедитесь, что ваш фрагмент реализует эту функцию обратного вызова:

implements OnMapReadyCallback 

объявить глобальный private MapView mapView;

и глобальный GoogleMap, если вам нужен private GoogleMap mMap;

затем в onCreateView вашего фрагмента: mapView = (MapView) view.findViewById(R.id.myMapView); mapView.onCreate(savedInstanceState); mapView.getMapAsync(this);

, а также реализовать метод обратного вызова:

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    final LatLng PERTH = new LatLng(-31.90, 115.86); // Perth, Australia 
    Marker mymarker = googleMap.addMarker(new MarkerOptions().position(PERTH).title("Perth,Australia")); 
    mymarker.showInfoWindow(); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(PERTH, 16)); 
    googleMap.getUiSettings().setZoomControlsEnabled(true); 
    googleMap.getUiSettings().setAllGesturesEnabled(true); 
    googleMap.getUiSettings().setCompassEnabled(true); 

} 
+0

Спасибо большое! Карта теперь в фоновом режиме без сбоев. ОДНАКО, он, кажется, загружается очень медленно, и я не могу прокручивать или увеличивать или взаимодействовать с ним (кроме нажатия на красный маркер («Peth, Australia»), который переключает отображение имени маркера). –

+0

Редактировать: Хотя мне кажется, что можно дважды коснуться, чтобы увеличить. Но никаких других элементов управления не работает. –

+0

Поскольку я использую GoogleMap по-другому - в действии - я больше не могу вам помочь. Я просто нашел решение для вас, и вместо этого используйте «MapView», если вы работаете с «фрагментом». Когда я попробовал решение, прежде чем дать его вам, карта была действительно медленной. Я предлагаю вам прочитать о «MapView», если никто другой не придет, чтобы дать предложение. – iBobb

Смежные вопросы