从地图片段切换到片段后,屏幕变黑

14

我已经在我的三个选项卡片段之一中添加了一个全屏地图碎片。除了切换选项卡时遇到的问题,一切都很好。

每次我从带有地图的片段切换到其他片段时,会出现黑屏约0.2秒钟的问题。这似乎是与带有地图碎片的活动中滚动问题类似的问题。

我尝试添加透明视图到地图的顶部,就像其他人建议的那样,但没有起作用。

这是我的xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ParkMapFragment">

    <fragment
        android:id="@+id/fullParkMap"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

这是我的代码:

public class ParkMapFragment extends Fragment {
    public ParkMapFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_map, container, false);
    }

    @Override
    public void onStart(){
        super.onStart();

        getActivity().setTitle("Map");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.fullParkMap);
        if (mapFragment != null) {
            getFragmentManager().beginTransaction().remove(mapFragment).commit();
        }
    }
}

有人有任何建议吗?


你找到解决方案了吗? - mukesh
9个回答

7

检查视图是否为空,如果不为空,则从其父视图中删除。这样,您就不会看到黑屏了。

尝试下面的代码。

片段:

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ExhibhitionMap2  extends Fragment implements OnMapClickListener,OnMarkerClickListener{

    View v;
    private  GoogleMap mMap;
    FragmentManager fragmentManager;

     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {

    //   android = inflater.inflate(R.layout.activity_exhibhition_map, container, false);

         if (v != null) {
                ViewGroup parent = (ViewGroup) v.getParent();
                if (parent != null)
                    parent.removeView(v);
            }
            try {
                 v = inflater.inflate(R.layout.activity_exhibhition_map, container, false);
            } catch (InflateException e) {
                /* map is already there, just return view as it is */
            }

         setUpMapIfNeeded();        
         return v;
     }

     /***** Sets up the map if it is possible to do so *****/
        public  void setUpMapIfNeeded() {
            // Do a null check to confirm that we have not already instantiated the map.
            if (mMap == null) {


                mMap = ((SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.map2)).getMap();

                // Check if we were successful in obtaining the map.
                if (mMap != null)
                {
                    mMap.setOnMapClickListener(this);
                    mMap.setOnMarkerClickListener((OnMarkerClickListener) this);

                     MarkerOptions marker = new MarkerOptions().position(new LatLng(36.011513,-115.174853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                             .title("P-1");

                     MarkerOptions marker01 = new MarkerOptions().position(new LatLng(36.111513,-115.204853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                             .title("P-2");

                     MarkerOptions marker02 = new MarkerOptions().position(new LatLng(36.051513,-115.154853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                             .title("P-3");


                     MarkerOptions marker03 = new MarkerOptions().position(new LatLng(36.057513,-115.344853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                             .title("P-4");

                     MarkerOptions marker1 = new MarkerOptions().position(new LatLng(36.081513,-115.224853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN))
                             .title("F-1");

                     MarkerOptions marker2 = new MarkerOptions().position(new LatLng(36.051513,-115.334853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN))
                             .title("F-2");

                     MarkerOptions marker3 = new MarkerOptions().position(new LatLng(36.101513,-115.124853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN))
                             .title("F-1");

                     MarkerOptions marker4 = new MarkerOptions().position(new LatLng(36.031513,-115.154853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN))
                             .title("F-2");

                     MarkerOptions marker5 = new MarkerOptions().position(new LatLng(36.081513,-115.194853))
                             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN))
                             .title("F-2");


                     mMap.addMarker(marker);
                     mMap.addMarker(marker01);
                     mMap.addMarker(marker02);
                     mMap.addMarker(marker03);

                     mMap.addMarker(marker1);
                     mMap.addMarker(marker2);
                     mMap.addMarker(marker3);
                     mMap.addMarker(marker4);

                     mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(36.051513,-115.174853), 10.0f));

                }

            }
        }

    @Override
    public boolean onMarkerClick(Marker marker) {

        /*Toast.makeText(getActivity(),
                  "" + marker.getTitle(), Toast.LENGTH_LONG)
                  .show();*/

        marker.showInfoWindow();

        return false;
    }

    @Override
    public void onMapClick(LatLng arg0) {
        // TODO Auto-generated method stub

    }

    public void onDestroy() {
        super.onDestroy();
    }

}

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.istride.mmps.ContactActivity" >



    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tableLayout1"
        android:visibility="gone"
        android:layout_margin="10dp" >

        <TextView
            android:id="@+id/tv_Title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Bharati Vidyapeeth University's"
            android:textColor="@color/black_text_color"
            android:textSize="@dimen/Large_Size" />

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
             android:layout_below="@+id/tv_Title"
            android:text="Department of Information Technology and Management "
            android:textColor="@color/black_text_color"
            android:textSize="@dimen/small_size" />

        <View
            android:id="@+id/view2"
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:layout_below="@+id/tv"
            android:layout_marginTop="10dp"
            android:background="@color/blue_background" />

         <RelativeLayout
        android:id="@+id/relative"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/view2"
         android:layout_marginTop="10dp"
        android:background="@color/gray_home">

        <TextView
            android:id="@+id/textVi1"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/tv_add"
            android:layout_alignParentTop="true"
            android:background="@color/blue_background"
            android:paddingBottom="2dp"
            android:paddingLeft="8dp"
            android:paddingRight="13dp"
            android:paddingTop="2dp"
            android:gravity="center_vertical"

            android:text="ADDRESS "
            android:textColor="@color/white_text_color"
            android:textSize="@dimen/Medium_size"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@+id/textVi1"
            android:paddingBottom="2dp"
            android:paddingTop="2dp"
            android:text="2nd Floor, Architecture Building, Bharati Vidyapeeth Campus, Dhankawadi, Pune-411043"
            android:textColor="@color/black_text_color"
            android:textSize="@dimen/Medium_size" />

        </RelativeLayout>

         <RelativeLayout
        android:id="@+id/relativeLayout_call"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/relative"
         android:layout_marginTop="10dp"
        android:background="@color/gray_home">

        <TextView
            android:id="@+id/textView1"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/tv_school_office_num"
            android:layout_alignParentTop="true"
            android:background="@color/blue_background"
            android:paddingBottom="2dp"
            android:paddingLeft="8dp"
            android:paddingRight="13dp"
            android:paddingTop="2dp"
            android:text="PHONE "
            android:gravity="center_vertical"
            android:textColor="@color/white_text_color"
            android:textSize="@dimen/Medium_size"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_school_office_num"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
        android:gravity="center_vertical"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_toRightOf="@+id/textView1"

            android:layout_toLeftOf="@+id/imageView2"
             android:textColor="@color/black_text_color"
              android:paddingTop="2dp"
               android:textSize="@dimen/Medium_size"
        android:paddingBottom="2dp"
            android:text="+91 989898989 asasa asas asasas ass  sdsd asas asas ass assas asas ass "  />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="3dp"
            android:src="@drawable/ic_call" />
        </RelativeLayout>

         <RelativeLayout
        android:id="@+id/relativeLayout_Email"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/relativeLayout_call"
         android:layout_marginTop="10dp"
        android:background="@color/gray_home">

        <TextView
            android:id="@+id/tex1"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/imageView1"
            android:layout_alignParentTop="true"
            android:background="@color/blue_background"
            android:gravity="center_vertical"
            android:paddingBottom="2dp"
            android:paddingLeft="8dp"
            android:paddingRight="13dp"
            android:paddingTop="2dp"
            android:text="EMAIL  "
            android:textColor="@color/white_text_color"
            android:textSize="@dimen/Medium_size"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_school_office_email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
              android:layout_alignBottom="@+id/imageView1"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
             android:gravity="center_vertical"
            android:layout_toRightOf="@+id/tex1"
             android:textColor="@color/black_text_color"
              android:paddingTop="2dp"
        android:paddingBottom="2dp"
         android:textSize="@dimen/Medium_size"
            android:text="principal.mmei@eternalmewar.in" />

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="3dp"
            android:src="@drawable/ic_email" />

        </RelativeLayout>





    </RelativeLayout>
 <fragment
             android:id="@+id/map2"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"

             android:layout_alignParentRight="true"

             android:layout_marginTop="10dp"
             class="com.google.android.gms.maps.SupportMapFragment"
             android:background="@color/gray_color"
             android:paddingBottom="5dp"
             android:layout_above="@+id/footer"
             android:textSize="@dimen/small_size" />

   <RelativeLayout
        android:id="@+id/footer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
         android:layout_alignParentBottom="true"
         android:layout_marginBottom="10dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true" >


 <TextView
        android:id="@+id/blue"
        android:layout_width="20dp"
        android:layout_height="20dp"

        android:background="#0000FF"
        android:gravity="center"
        android:layout_margin="10dp"

        android:textColor="@color/black_text_color"
        android:textSize="@dimen/small_size"
        android:textStyle="bold" />

 <TextView
        android:id="@+id/parking"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
      android:layout_toRightOf="@+id/blue"
        android:layout_alignTop="@+id/blue"
         android:layout_alignBottom="@+id/blue"
         android:gravity="center_vertical"
      android:text="Parking"
        android:textColor="@color/black_text_color"
        android:textSize="@dimen/Medium_size"
        android:textStyle="bold" />


  <TextView
        android:id="@+id/cyc"
        android:layout_width="20dp"
        android:layout_height="20dp"

        android:background="#00FFFF"
        android:gravity="center"
        android:layout_margin="10dp"
        android:layout_toRightOf="@+id/parking"
        android:textColor="@color/black_text_color"
        android:textSize="@dimen/small_size"
        android:textStyle="bold" />

 <TextView
        android:id="@+id/footer2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
      android:layout_toRightOf="@+id/cyc"
        android:layout_alignTop="@+id/cyc"
         android:layout_alignBottom="@+id/cyc"
         android:gravity="center_vertical"
      android:text="Food"
        android:textColor="@color/black_text_color"
        android:textSize="@dimen/Medium_size"
        android:textStyle="bold" />



</RelativeLayout>
</RelativeLayout>

2
   @Override
public void onDestroyView() {
    super.onDestroyView();
    SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.fullParkMap);
    if (mapFragment != null) {
        getFragmentManager().beginTransaction().remove(mapFragment).commit();
    }
}

在这里,你正在删除片段而没有用新的片段替换它。我建议使用.replace方法并添加一个新的片段。

可以像这样实现:

getFragmentManager().beginTransaction().replace(R.id.your_placeholder, new CustomFragment(), "cstmFragID").commit();

那段代码是为了避免这个问题:https://dev59.com/Qeo6XIcBkEYKwwoYOR0q。不幸的是,它对我现在遇到的问题没有影响。 - user3746428
你在哪里使用 .add 替换片段的代码? - Jacob Cooley
我对Android还比较新,但我猜onCreateView正在替换整个片段(包括地图片段在内)?每次我返回到该片段时,地图肯定会重新加载,所以我想那一定是发生的事情。 - user3746428
1
@user3746428 我认为这应该解决问题。你根本不应该覆盖onDestroyView方法。只需在想要将片段移出视图时替换它(使用上面的代码)。其余的事情都会被处理好。 - Arnold Balliu

2
这是一个已知的问题。同时,您可以通过在地图上方放置另一个视图,并使用与其容器相同的背景颜色来解决问题。这样一来,地图就会在准备好后平滑地显示出来。
SupportMapFragment mapFragment = SupportMapFragment.newInstance(new  GoogleMapOptions().zOrderOnTop(true));

1
问题不在于地图的出现,而是当我切换片段时(它会变黑几毫秒)。 - user3746428

2
我建议您使用MapView代替SupportFragment,以避免嵌套的片段。有关详细答案,请查看以下帖子:Should I use MapView or MapFragment 现在您的ParkFragment应该像这样:MapFragment.java
public class MapFragment extends Fragment implements OnMapReadyCallback {

    private MapView mMapView;
    private GoogleMap mGoogleMap;

    public MapFragment() {
        // Required empty public constructor
    }

    public static MapFragment newInstance() {
        MapFragment fragment = new MapFragment();
        return fragment;
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_map, container, false);
        mMapView = (MapView) rootView.findViewById(R.id.map);
        mMapView.onCreate(savedInstanceState);
        mMapView.getMapAsync(this);

        return rootView;
    }

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


    @Override
    public void onPause() {
        mMapView.onPause();
        super.onPause();
    }

    @Override
    public void onDestroy() {
        mMapView.onDestroy();
        super.onDestroy();
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        googleMap.getUiSettings().setZoomControlsEnabled(true);

    }
}

fragment_map.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</FrameLayout>

刚试了一下,不幸的是它有同样的问题。 - user3746428

2
问题可能是因为重新创建了Fragment导致了黑屏。如果您正在使用ViewPager,则可以使用。
// Note that you must set adapter before this line otherwise it can cause NullPointerException
// Or add null check on getAdapter if required
mViewPager.setOffscreenPageLimit(mViewPager.getAdapter().getCount());

这将强制ViewPager不再创建片段。当然,这需要更多的内存,但我认为在使用较少选项卡时更有效率,因此我通常这样做以避免重建片段。

其次,我建议从onDestroy中删除这些行:

SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.fullParkMap);
if (mapFragment != null) {
    getFragmentManager().beginTransaction().remove(mapFragment).commit();
}

通过更新 onCreateView 来解决此问题,更新后的代码如下:

private View mView;

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

它不会每次都充气布局,因此您将不会遇到“com.google.android.gms.maps.MapFragment”的重复ID、标记空或父ID与另一个片段的问题。
但请确保在inflater.inflate的attachToRoot参数中传递false,否则您可能会遇到异常,例如“The specified child already has a parent”。

最后一件事,在Fragment中使用MapFragment,或者换句话说,在使用嵌套片段时,建议使用getChildFragmentManager()而不是getFragmentManager(),以避免出现意外问题。
因为正如文档所说:
getFragmentManager:返回与此片段的活动关联的片段进行交互的FragmentManager。请注意,在片段放置在FragmentTransaction中并附加到其活动之前的时间内,这将是非空的。如果此片段是另一个片段的子项,则此处返回的FragmentManager将是父项的getChildFragmentManager()。
getChildFragmentManager:返回用于放置和管理此片段内的片段的私有FragmentManager。

谢谢,你救了我的一天! - Max Shwed

1

由于您总是替换片段,因此地图始终会被创建,解决方法是仅加载一次地图片段,其余时间只需显示/隐藏片段(就像您显示选项卡片段一样)。


1

你尝试过隐藏和显示片段(而不是删除/添加它)吗?

private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        fragmentA = FragmentA.newInstance("foo");
        fragmentB = FragmentB.newInstance("bar");
        fragmentC = FragmentC.newInstance("baz");
    }
}

在您的情况下,您可能需要将其更改为ParkMapFragment等。
protected void displayFragmentA() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (fragmentA.isAdded()) { // if the fragment is already in container
        ft.show(fragmentA);
    } else { // fragment needs to be added to frame container
        ft.add(R.id.flContainer, fragmentA, "A");
    }
    // Hide fragment B
    if (fragmentB.isAdded()) { ft.hide(fragmentB); }
    // Hide fragment C
    if (fragmentC.isAdded()) { ft.hide(fragmentC); }
    // Commit changes
    ft.commit();
}

来源:https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments

创建和使用片段

片段是用户界面的一部分,类似于活动,它们具有自己的生命周期,并接收其自己的输入事件。片段的优点在于,它们可以在不同的屏幕尺寸和设备上重复使用,并且可以与其他片段组合在一起以构建灵活的用户界面。

本指南介绍了如何创建和使用片段,包括如何将片段添加到活动中,如何从一个片段向另一个片段传递数据以及如何在片段之间进行通信。


1
尝试在 createView 中添加以下内容:
if (v != null) {
    ViewGroup parent = (ViewGroup) v.getParent();
    if (parent != null)
        parent.removeView(v);
}

0

你应该通过这种方式进行片段的转换:

Fragment fragment = new YourFragmentToShow();
getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment, TAG).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit(); 

使用 TRANSIT_FRAGMENT_FADE 片段应该只是淡入或淡出;也就是说,除了它因某种原因出现或消失之外,没有强烈的导航与之相关。

当您用另一个片段替换地图时,请使用它,否则我建议常规使用,不使用 (.setTransition...):

Fragment fragment = new YourFragmentToShow();
getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment, TAG).commit(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接