[android] 조각의 MapView (Honeycomb)

이제 최종 SDK가 Google API와 함께 나왔습니다. MapView로 조각을 만드는 가장 좋은 방법은 무엇입니까? MapView가 제대로 작동하려면 MapActivity가 필요합니다.

프래그먼트를 관리하는 액티비티가 MapActivity에서 상속하고 (프래그먼트가 자체 포함되어 있다는 생각에 반하기 때문에 잘못된 솔루션) 일반 xml 기반 레이아웃을 사용하는 것은 작동하지 않습니다. MapActivity.setupMapView ()에서 NullPointerException이 발생합니다.

E / AndroidRuntime (597) : 원인 : java.lang.NullPointerException
E / AndroidRuntime (597) : com.google.android.maps.MapActivity.setupMapView (MapActivity.java:400)에서
E / AndroidRuntime (597) : com.google.android.maps.MapView. (MapView.java:289)
E / AndroidRuntime (597) : com.google.android.maps.MapView. (MapView.java:264)
E / AndroidRuntime (597) : com.google.android.maps.MapView. (MapView.java:247)

두 번째 아이디어는 MapView를 프로그래밍 방식으로 만들고 관련 활동을 (getActivity ()를 통해) 컨텍스트로 MapView 생성자에 전달하는 것입니다. 작동하지 않음 :

E / AndroidRuntime (834) : 원인 : java.lang.IllegalArgumentException : MapViews는 MapActivity 인스턴스 내에서만 만들 수 있습니다.
E / AndroidRuntime (834) : com.google.android.maps.MapView. (MapView.java:291)
E / AndroidRuntime (834) : com.google.android.maps.MapView. (MapView.java:235)
E / AndroidRuntime (834) : de.foo.FinderMapFragment.onCreateView (FinderMapFragment.java:225)
E / AndroidRuntime (834) : android.app.FragmentManagerImpl.moveToState (FragmentManager.java:708)
E / AndroidRuntime (834) : android.app.FragmentManagerImpl.moveToState (FragmentManager.java:900)
E / AndroidRuntime (834) : android.app.FragmentManagerImpl.addFragment (FragmentManager.java:978)에서
E / AndroidRuntime (834) : android.app.Activity.onCreateView (Activity.java:4090)에서
E / AndroidRuntime (834) : android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:664)에서

실제로 MapView가 필요한 백그라운드 스레드를 처리하는 MapFragment와 같은 것이 있어야합니다. 그렇다면 현재 가장 좋은 방법은 무엇입니까?

독일 발렌틴에서 감사합니다.



답변

2012 년 3 월 12 일부로 Google은 Google Maps Android API v2를 출시했습니다 . 이제 이러한 문제를 잊을 수 있습니다.
https://developers.google.com/maps/documentation/android/

새 API를 사용한 예-https: //developers.google.com/maps/documentation/android/start#add_a_map

이 API는 Android API 8 이상에서 작동하므로 사용하십시오.).

이제 간단히 “com.google.android.gms.maps.MapFragment”조각 클래스를 사용할 수 있습니다. 활동에지도가 표시됩니다. 위 링크의 레이아웃 예 :

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment"/>


답변

조각에서 TabHost를 사용하여이 문제를 해결했습니다.

다음은 아이디어입니다 (간단히).

  1. MainFragmentActivity확장 FragmentActivity(지원 라이브러리에서) 및 MapFragment.

  2. MyMapActivity확장 MapActivity하고 포함합니다 MapView.

  3. LocalActivityManagerFragment 호스트 LocalActivityManager

  4. MapFragment확장 LocalActivityManagerFragment합니다.

  5. 그리고 그것에 활동을 LocalActivityManager포함 MyMapActivity합니다.

구현 예 : https://github.com/inazaruk/map-fragment .


여기에 이미지 설명 입력


답변

Google 그룹스 에서 논의한대로 Peter Doyle은 Google지도를 지원하는 맞춤 호환성 라이브러리도 구축했습니다. android-support-v4-googlemaps

그러나 단점도 있습니다.

현재 한 가지 단점은 FragmentActivity를 확장하는 모든 클래스가 MapActivity라는 것입니다. 별도의 클래스 (예 : FragmentMapActivity)를 만들 수 있지만 FragmentActivity 코드의 일부 리팩토링이 필요합니다.


답변

답을 명확히하기 위해서입니다. 나는 inazaruk와 ChristophK가 제안한 접근 방식을 시도했습니다. 실제로 Google지도뿐만 아니라 단편에서 모든 활동을 실행할 수 있습니다. 다음은 inazaruk 및 ChristophK 덕분에 Google지도 활동을 조각으로 구현하는 코드입니다.

import com.actionbarsherlock.app.SherlockFragment;
import android.view.Window;

import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MapFragment extends SherlockFragment {
    private static final String KEY_STATE_BUNDLE = "localActivityManagerState";

    private LocalActivityManager mLocalActivityManager;

    protected LocalActivityManager getLocalActivityManager() {
        return mLocalActivityManager;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle state = null;
        if (savedInstanceState != null) {
            state = savedInstanceState.getBundle(KEY_STATE_BUNDLE);
        }

        mLocalActivityManager = new LocalActivityManager(getActivity(), true);
        mLocalActivityManager.dispatchCreate(state);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            //This is where you specify you activity class
        Intent i = new Intent(getActivity(), GMapActivity.class);
        Window w = mLocalActivityManager.startActivity("tag", i);
        View currentView=w.getDecorView();
        currentView.setVisibility(View.VISIBLE);
        currentView.setFocusableInTouchMode(true);
        ((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
        return currentView;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBundle(KEY_STATE_BUNDLE,
                mLocalActivityManager.saveInstanceState());
    }

    @Override
    public void onResume() {
        super.onResume();
        mLocalActivityManager.dispatchResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mLocalActivityManager.dispatchPause(getActivity().isFinishing());
    }

    @Override
    public void onStop() {
        super.onStop();
        mLocalActivityManager.dispatchStop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mLocalActivityManager.dispatchDestroy(getActivity().isFinishing());
    }
}


답변

이에 대한 Google의 좋은 소식입니다. 오늘 실내지도 및 MapFragment가 포함 된 새로운 Google Maps API를 출시합니다 .

With this new API, adding a map to your Activity is as simple as:

<fragment
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.MapFragment" />


답변

Google Maps API는 AOSP의 일부가 아닙니다. Google 직원이 응답하지 않는 한 향후 MapFragment가 있을지 여부를 알 수 없습니다.

가능한 제한적인 대안은 a를 사용하고 WebViewFragment이를 남용하여 사용자 정의 maps.google.comURL 을로드하는 것 입니다.


답변

Google이 아직 응답하지 않은 것이 너무 아쉽습니다. FWIW 당신이 정말로 이것을해야한다면 나는 다른 방법을 찾지 못했습니다.

탭 관리 활동을 MapActivity에서 상속하고 거기에 프로그래밍 방식으로 MapView를 만들고 mapfragment.xml에 ViewGroup을 포함하고 다음을 사용하여 MapView를 ViewGroup에 추가합니다.

((ViewGroup) getFragmentManager (). findFragmentById (R.id.finder_map_fragment) .getView ()). addView (mapView) ;;

분명히 이것은 파편이 독립적이어야한다는 생각에 강하게 반대되지만 …