2011-10-19 30 views
11

Tôi đang sử dụng lớp tương thích Android với hack cho việc sử dụng mapviews trong một đoạn tìm thấy ở đây: https://github.com/petedoyle/android-support-v4-googlemapsKhông thể thêm hai lần xem bản đồ Android với các phân đoạn?

Thật không may, những gì tôi đang tìm là nếu mapfragment sẽ bị gỡ khỏi hoạt động, và sau đó readded, tôi nhận được "Bạn chỉ được phép có một lỗi MapView duy nhất trong MapActivity".

Tôi hiểu nguyên tắc đằng sau lỗi và cố gắng phá hủy mapview trong phương thức onPause phân đoạn. Thật không may là tôi dường như không thể phá hủy mapview Mã của tôi trông giống như sau:

private RelativeLayout layout; 
private MapView mp; 

public void onResume(){ 
    super.onResume(); 
    Bundle args = getArguments(); 
    if(mp == null) 
    { 
     mp = new MapView(getActivity(), this.getString(R.string.map_api_key)); 
     mp.setClickable(true); 
    } 

    String request = args.getString("requestId"); 
    layout = (RelativeLayout) getView().findViewById(R.id.mapholder); 
    layout.addView(mp); 
    //TextView txt = (TextView) getView().findViewById(R.id.arguments); 
    //txt.setText(request); 
} 

public void onPause(){ 
    super.onPause(); 
    layout.removeView(mp); 
    mp = null; 
} 

Có ai có bất cứ suy nghĩ nào về những gì tôi tham chiếu bỏ qua để tiêu diệt ở đây không?

Trả lời

15

Tôi gặp phải vấn đề tương tự. Dưới đây là cách tôi giải quyết nó:

  • Vì nó chỉ nên là một ví dụ của MapView trong hoạt động này, tôi khởi tạo nó trong phương thức onCreate trong Hoạt động:

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // initialize MapView programmatically to be used in Fragment : 
        this.mActivityMapView = new MapView(MainActivity.this, getString(R.string.debug_mapview_apikey)); 
    
        setContentView(R.layout.activity_main); 
    } 
    
  • Sau đó, tôi lấy lại nó trong đoạn onCreateView phương pháp:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        this.mMapView = ((MainActivity) getActivity()).getMapView(); 
        return this.mMapView; 
    } 
    
  • Và tôi tiêu diệt nó trong phương pháp đoạn onDestroy:

    01.
    public void onDestroy() { 
        NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
        parentView.removeView(this.mMapView); 
        super.onDestroy(); 
    } 
    
6

Bạn có thể muốn loại bỏ các bản đồ trong phương thức onPause (thay vì phương pháp onDestroy)

public void onPause() { 
    NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
    parentView.removeView(this.mMapView); 
    super.onPause();} 

Bằng cách này, bạn có thể thêm một MapFragment đến backstack. (FragmentTransaction.addToBackStack ngăn chặn một đoạn bị phá hủy)

6

Câu trả lời của Max và Bleeker hoạt động tốt nhưng bạn cần phải đặc biệt quan tâm nếu bạn muốn hỗ trợ thay đổi hướng màn hình, như tôi. Nó chỉ ra khi bạn xoay màn hình, nó sẽ gọi OnCreateView một lần nữa mà không cần gọi phương thức onPause, do đó thêm mapview hai lần. Để khắc phục sự cố, bên trong OnCreateView tôi đã làm như sau:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    this.mMapView = ((MyGameActivity) getActivity()).getMapView(); 
    if (this.mMapView.getParent()!=null) 
    { 
     NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
     parentView.removeView(this.mMapView); 
    } 
    return this.mMapView; 
} 
4

Tôi đã cố gắng để có được một giải pháp đơn giản cho vấn đề này. Trên lớp xử lý chi tiết Chế độ xem của tôi (tiện ích mở rộng RelativeLayout), tôi đã khai báo một số private static MapView myMapView;.

Sau đó, ghi đè phương pháp onFinishInflate() như đoạn mã sau:

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    //myMapView = (MapView) findViewById(R.id.map_view); 
    if (myMapView==null) 
     myMapView = new MapView(context, getResources().getString(R.string.map_view_api_key)); 
    if (myMapView.getParent() != null) 
     ((ViewGroup)myMapView.getParent()).removeView(myMapView); 

    myMapView.setClickable(true); 
    myMapView.setEnabled(true); 
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    myMapView.setLayoutParams(lp);   
    this.addView(myMapView); 

} 

Bằng cách này bạn chỉ có một thể hiện của MapView.

0

Đây là cách tôi giải quyết vấn đề này trong trường hợp Phân đoạn.

Tạo Layout

<LinearLayout 
     android:id="@+id/ll_mapcontainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" /> 

Bạn có thể đặt bố cục như thế này bất cứ nơi nào trong tập tin XML của bạn, nơi bạn muốn hiển thị bản đồ

Bây giờ Bộ luật sẽ Như thế này.

package com.yuviii.sample; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
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.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.yuviii.sample.R; 

/** 
* Created by yubraj Poudel on 12/20/15. 
*/ 
public class ContactUsFragment extends Fragment { 
    static final LatLng PRACTICAL_ANSWER_LOCATION = new LatLng(53.558, 9.927); 
    private SupportMapFragment fragment; 
    private GoogleMap map; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.page_contactus, container, false); 
     return v; 
    } 



    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
        initializeMap(); 
    } 

    private void initializeMap() { 

     FragmentManager fm = getChildFragmentManager(); 
     fragment = (SupportMapFragment) fm.findFragmentById(R.id.ll_mapcontainer); 
     if (fragment == null) { 
      fragment = SupportMapFragment.newInstance(); 
      fm.beginTransaction().replace(R.id.ll_mapcontainer, fragment).commit(); 
     } 

    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     if (map == null) { 
      map = fragment.getMap(); 
      map.addMarker(new MarkerOptions().position(PRACTICAL_ANSWER_LOCATION)); 
     } 
    } 
} 

Điều này phù hợp với tôi. Thưởng thức !!!

Các vấn đề liên quan