Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在MapFragment和ListFragment之间切换_Android_Google Maps_Android Fragments_Mapfragment_Android Nested Fragment - Fatal编程技术网

Android 在MapFragment和ListFragment之间切换

Android 在MapFragment和ListFragment之间切换,android,google-maps,android-fragments,mapfragment,android-nested-fragment,Android,Google Maps,Android Fragments,Mapfragment,Android Nested Fragment,我正在创建一个应用程序,在其中我想在我的CustomMapFragment和ListFragment之间切换。如果我启动应用程序并调用replaceFragment: private void replaceFragment(final Fragment fragment) { final FragmentManager fragmentManager = mActivity.getFragmentManager(); fragmentManager.beginTransacti

我正在创建一个应用程序,在其中我想在我的
CustomMapFragment
ListFragment
之间切换。如果我启动应用程序并调用
replaceFragment

private void replaceFragment(final Fragment fragment) {
    final FragmentManager fragmentManager = mActivity.getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.main_content_frame, fragment)
            .commit();
}
使用
replaceFragment(new CustomMapFragment())
映射看起来应该是这样的

CustomMapFragment
是一个片段,我将
FrameLayout
替换为本机
MapFragment
,将其与代码分离

如果我在按钮单击或其他操作时再次调用replace方法,使用不同的
片段
(例如
ListFragment
),则
FrameLayout
将被替换为此,一切正常

如果我现在再次尝试用
CustomMapFragment
替换它,则会加载与开头完全相同的调用
Map
,但它缺少每个
标记和我在
CustomMapFragment
中所做的每个设置

CustomMapFragment

public class CustomMapFragment extends BaseFragment {

    private static final String LOG_TAG = PosMapFragment.class.getSimpleName();
    private MapFragment mMapFragment;
    private GoogleMap   mMap;
    private ImageLoader mImageLoader;

    private Context     mContext;

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

        mContext = getActivity();

        final RequestQueue reqQueue = Volley.newRequestQueue(mContext);
        mImageLoader = new ImageLoader(reqQueue, new BitmapLruCache(mContext));
    }

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

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

        mMapFragment = MapFragment.newInstance();
        replaceFragment(mMapFragment);
    }

    private void postMapInitialisation() {
        new View(getActivity()).post(new Runnable() {
            @Override
            public void run() {
                addTestMarker(0, 0, "http://www.jimis-cyberstore.com/store/media/gp_batman_tshirts.jpg");
                addTestMarker(10, 10, "http://img.netzwelt.de/software/icons/2012/8842/android-sdk.png");
                addTestMarker(50, 50, "http://fs02.androidpit.info/ali/x84/4053084-1374511678988-80x80.png");
                addTestMarker(5, 0, "http://im.wk.io/images/77e3e40/kitkat-chromium-ubernimmt-in-android.jpeg");
                addTestMarker(0, 10, "http://www.mchme.de/cms/kategorien/18_Software/dateien/fb_logo_80.jpg");
                addTestMarker(15, 5, "http://navigator.ptvgroup.com/uploads/pics/PTV_Navigator_Android_Windows2_80x80px_01.png");
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        setUpMapIfNeeded();
        postMapInitialisation();
        EventBusProvider.getInstance().register(this);
    }

    private void replaceFragment(final Fragment fragment) {
        final FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.maps, fragment)
                .commit();
    }

    private void setUpMapIfNeeded() {
        if (mMap == null) {
            mMap = mMapFragment.getMap();
            if (mMap != null) {
                mMap.setMyLocationEnabled(true);
                mMap.setInfoWindowAdapter(this);
                mMap.setOnInfoWindowClickListener(this);
            }
        }
    }

    private void addTestMarker(final double lat, final double lng, String url){
        if(mMap != null){
            final NetworkImageMarker networkImageMarker = new NetworkImageMarker(mContext, url);
            final Marker marker = mMap.addMarker(networkImageMarker.getMarkerOptions(lat, lng, mImageLoader));
            networkImageMarker.setMarker(marker);
            networkImageMarker.setReloadListener(new OnReloadListener() {
                @Override
                public void reAddNetworkImageMarker(Bitmap bitmap) {
                    mMap.addMarker(networkImageMarker.getMarkerOptions(lat, lng, bitmap));
                }
            });
        }
    }

    @Subscribe
    public void onLocationChanged(final LocationChangedEvent event) {
        centerMap(event.mLocation);
    }

    private void centerMap(Location location){
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        centerMapAtLocation(latLng);
    }

    private void centerMapAtLocation(LatLng location) {
        mMap.moveCamera(CameraUpdateFactory.newLatLng(location));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
    }
}
主布局只是一个
FrameLayout
,它被不同的
片段所取代。我还尝试只加载一个
片段
,其中
CustomMapFragment
ListFragment
是同时加载的,有两个
FrameLayout
s,因此它们彼此堆叠在一起,但结果是相同的

似乎
MapFragment
(而不是
SupportMapFragment
)有问题

  • 开始加载
    MapFragment
    =
    MapFragment
    看起来很完美
  • MapFragment
    ->
    ListFragment
    ->
    MapFragment
    =
    MapFragment
    是一个空映射
  • ListFragment
    ->
    MapFragment
    =
    MapFragment
    是一个空映射
  • MapFragment
    ->
    MapFragment
    =
    MapFragment
    是一个空映射

因为您试图替换另一个片段的内部的片段,所以应该在替换方法中使用getChildFragmentManager()而不是getFragmentManager()

private void replaceFragment(final Fragment fragment) {
    final FragmentManager fragmentManager = getChildFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.maps, fragment)
            .commit();
}

不幸的是,getChildFragmentManager()仅在api lvl>=17时受支持,因此您可能必须使用android-support-v4库。

SetupMapiFeeded()
中调用
PostMapiInitialization()
是否会有所不同?
SetupMapiFeeded()
只是在
onResume()中调用的
postmapinitialization()
始终在
setupmapifneed()之后调用。所以我想这不会有什么区别。请尝试将
postCapitalization()
移动到您的if条件中。我怀疑
map
仍然是
null
。我做了更改,但没有做任何更改-似乎该映射与第一个加载的映射不同。它也没有启用诸如MyLocation或compass之类的设置。在调试过程中,我看到他添加了标记并设置了地图。由于某种原因,我认为有两个映射相互重叠。请检查两件事:(1)在
addTestMarker()
中添加
else
子句,以涵盖
mMap==null
时的情况。(2) 在活动中,检查
CustomMapFragment
的实例是否相同。我遇到一个问题,列表的页脚在切换时消失。使用getChildFragmentManager解决了我的问题