조각의 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를 사용하여이 문제를 해결했습니다.
다음은 아이디어입니다 (간단히).
MainFragmentActivity
확장FragmentActivity
(지원 라이브러리에서) 및MapFragment
.MyMapActivity
확장MapActivity
하고 포함합니다MapView
.LocalActivityManagerFragment
호스트LocalActivityManager
MapFragment
확장LocalActivityManagerFragment
합니다.그리고 그것에 활동을
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 possible limited alternative is to use a WebViewFragment
and abuse it to load up a custom maps.google.com
URL.
Hm too bad that Google has not responded yet. FWIW if you really need to do this I found no other way than:
Have the Tab Managing Activity inherit from MapActivity, create the MapView in there programmatically, have the mapfragment.xml contain a ViewGroup and add the MapView to the ViewGroup using
((ViewGroup) getFragmentManager().findFragmentById(R.id.finder_map_fragment).getView()).addView(mapView);;
Clearly this goes strongly against the idea that fragments are ment to be self-contained but ...
Here's a MonoDroid (Mono for Android) version of a very-simplified MapFragment:
public class MapFragment : Fragment
{
// FOLLOW http://stackoverflow.com/questions/5109336/mapview-in-a-fragment-honeycomb
private static String KEY_STATE_BUNDLE = "localActivityManagerState";
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Bundle state = null;
if (savedInstanceState != null) {
state = savedInstanceState.GetBundle(KEY_STATE_BUNDLE);
}
mLocalActivityManager = new LocalActivityManager(Activity, true);
mLocalActivityManager.DispatchCreate(state);
}
public override Android.Views.View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//This is where you specify you activity class
Intent i = new Intent(Activity, typeof(SteamLocationMapActivity));
Window w = mLocalActivityManager.StartActivity("tag", i);
View currentView=w.DecorView;
currentView.Visibility = ViewStates.Visible;
currentView.FocusableInTouchMode = true;
((ViewGroup) currentView).DescendantFocusability = DescendantFocusability.AfterDescendants;
return currentView;
}
private LocalActivityManager mLocalActivityManager;
protected LocalActivityManager GetLocalActivityManager() {
return mLocalActivityManager;
}
public override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
outState.PutBundle(KEY_STATE_BUNDLE,mLocalActivityManager.SaveInstanceState());
}
public override void OnResume()
{
base.OnResume();
mLocalActivityManager.DispatchResume();
}
public override void OnPause()
{
base.OnPause();
mLocalActivityManager.DispatchPause(Activity.IsFinishing);
}
public override void OnStop()
{
base.OnStop();
mLocalActivityManager.DispatchStop();
}
}
This solves my issue in adding MapView in Fragments. https://github.com/petedoyle/android-support-v4-googlemaps
With the new version of ABS 4.0, there is no suppport for MapFragmentActivity, here is a good solution for having a mapview in a Fragment!
https://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/#comment-21
May I get the solution:
- create class TempFragmentActivity extends MapActivity
- there is a MapView object inside TempFragmentActivity(like normal define in xml)
- remove this MapView object form parent(LinearLayout)(void later exception)
- keep this MapView object in somewhere(ex: static member of TempFragmentActivity)
- in your Fragment , add this MapView object using code(do not define in xml) into some LinearLayout
저는 MapFragment 문제에 대한 LocalActivityManager 기반 솔루션을 매시업하는 작은 라이브러리를 작성했습니다 (다양한 사용 상황을 보여주는 예제 앱도 포함).
https://github.com/coreform/android-tandemactivities
참고 URL : https://stackoverflow.com/questions/5109336/mapview-in-a-fragment-honeycomb
'developer tip' 카테고리의 다른 글
항상 다음 정수로 반올림하는 방법 (0) | 2020.10.06 |
---|---|
Console.WriteLine ()과 Debug.WriteLine ()의 차이점은 무엇입니까? (0) | 2020.10.05 |
방향 변경시 Fragment를 처리하는 확실한 방법 (0) | 2020.10.05 |
Python Pandas는 특정 열만 병합합니다. (0) | 2020.10.05 |
angularjs e2e 각도기 테스트에서 파일을 업로드하는 방법 (0) | 2020.10.05 |