Tôi đang cố gắng hiển thị MapView bên trong một đoạn (sử dụng thư viện tương thích bị tấn công). Sau đây đã chỉ làm việc tốt trong quá khứ:MapView bên trong Fragment - con được chỉ định đã có một phụ huynh
- đoạn của
onCreateView()
chỉ đơn giản là trả về một mớiFrameLayout
- đoạn của
onActivityCreated()
nhận được MapView từ Acitivity và thêm nó vào xem hệ thống cấp bậc của nó onDestroyView()
loại bỏ các MapView từ của nó xem hệ thống phân cấp
Bây giờ tôi muốn đoạn sử dụng bố cục được xác định trong xml để tôi có thể có một số nội dung giao diện người dùng khác. Đưa yếu tố MapView
trong file bố trí luôn bị treo, vì vậy tôi đang làm nó theo cách này:
map_screen_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/map_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
</LinearLayout>
My MapScreenActivity
giữ thực tế MapView
, và đoạn gọi getMapView()
, vì vậy tôi không chạy vào "không thể có nhiều hơn một MapView" vấn đề:
MapScreenActivity.java
public class MapScreenActivity extends FragmentActivity {
protected Fragment fragment;
protected MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_pane_empty);
if (savedInstanceState == null) {
fragment = new MapScreenFragment();
getSupportFragmentManager().beginTransaction().add(R.id.root_container, fragment)
.commit();
}
}
public MapView getMapView() {
if (mapView == null) {
mapView = new MapView(this, getResources().getString(R.string.maps_api_key));
}
return mapView;
}
}
MapScreenFragment.java
public class MapScreenFragment extends Fragment {
protected ViewGroup mapContainer;
protected MapView mapView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle args) {
View root = inflater.inflate(R.layout.map_screen_fragment, container);
mapContainer = (ViewGroup) root.findViewById(R.id.map_container);
return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mapView = ((MapScreenActivity) getActivity()).getMapView();
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true);
mapContainer.addView(mapView);
}
@Override
public void onDestroyView() {
super.onDestroyView();
mapContainer.removeView(mapView);
}
}
Về lý thuyết, điều này tất cả phải làm việc theo cách tương tự như new FrameLayout
phương pháp mô tả đầu tiên. Tuy nhiên, tôi có được điều này mỗi khi:
02-24 18:01:28.139: E/AndroidRuntime(502): FATAL EXCEPTION: main
02-24 18:01:28.139: E/AndroidRuntime(502): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapfragment/com.example.mapfragment.MapScreenActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.os.Handler.dispatchMessage(Handler.java:99)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.os.Looper.loop(Looper.java:130)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-24 18:01:28.139: E/AndroidRuntime(502): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 18:01:28.139: E/AndroidRuntime(502): at java.lang.reflect.Method.invoke(Method.java:507)
02-24 18:01:28.139: E/AndroidRuntime(502): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-24 18:01:28.139: E/AndroidRuntime(502): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-24 18:01:28.139: E/AndroidRuntime(502): at dalvik.system.NativeStart.main(Native Method)
02-24 18:01:28.139: E/AndroidRuntime(502): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
02-24 18:01:28.139: E/AndroidRuntime(502): at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.view.ViewGroup.addView(ViewGroup.java:1871)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.view.ViewGroup.addView(ViewGroup.java:1828)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.view.ViewGroup.addView(ViewGroup.java:1808)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.NoSaveStateFrameLayout.wrap(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.BackStackRecord.run(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.support.v4.app.FragmentActivity.onStart(Unknown Source)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.Activity.performStart(Activity.java:3791)
02-24 18:01:28.139: E/AndroidRuntime(502): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1620)
02-24 18:01:28.139: E/AndroidRuntime(502): ... 11 more
tôi đã cố gắng loại bỏ các các MapView
từ đó là cha mẹ trước khi trở về từ getMapView()
, và đó vẫn bị treo. Tôi thực sự không hiểu tại sao phương pháp này không hiệu quả, bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao.
Đã một thời gian kể từ khi tôi xem lại dự án đó, nhưng các mảnh vỡ khá mới đối với tôi vào thời điểm đó, vì vậy tôi nghi ngờ đây thực sự là câu trả lời đúng. – Karakuri
Cảm ơn vì điều này, đã không nhận ra những gì đang xảy ra cho đến khi bạn cho thấy đối số cuối cùng :) – lfxgroove
Cuộc gọi tốt, cảm ơn vì điều đó. :-) –