【问题标题】:How to fix black screen when replacing SupportMapFragment更换 SupportMapFragment 时如何修复黑屏
【发布时间】:2019-02-05 19:24:14
【问题描述】:

我正在片段中使用 Mapbox(使用 mapbox-android-sdk:7.1.0)创建一个简单的应用程序。

我有一个由 FrameLayout(包含片段)和一个按钮组成的活动。

一开始,Fragment1(包含地图)显示在 FrameLayout 中。当用户点击按钮时,Fragment1 被 Fragment2 替换(包含一个 TextView)。

在过渡期间有短暂的黑屏。

当我在活动中使用 Mapbox 时,我没有任何问题,它似乎是在调用方法 onDestroyView() 时发生的。

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Load Fragment1 containing the map
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment1()).commit();


        AppCompatButton button = findViewById(R.id.btn_changeFragment);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Load Fragment2 containing a TextView
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment2()).addToBackStack(null).commit();
            }
        });
    }
}

Fragment1.java:

public class Fragment1 extends SupportMapFragment {
    private MapView mapView;

    public Fragment1(){}

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(getContext(), getString(R.string.mapbox_token));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_1, container, false);
        mapView = view.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {
                        // Configure the map
                    }
                });
            }
        });

        return view;
    }

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

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

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

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

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}

【问题讨论】:

    标签: android android-fragments mapbox


    【解决方案1】:

    在片段内加载地图视图时使用此属性 app:mapbox_renderTextureMode="true" 对我有用。

    【讨论】:

      【解决方案2】:

      这是 MapFragment 行为方式的一个已知问题:https://github.com/mapbox/mapbox-gl-native/issues/9570。根据票证,目前有两种可能的方法可以在您的应用中解决此问题。

      任一

      1. 在转换时使用ImageView 中的地图位图而不是MapView。然后,您可以在 Activity 中将 MapView 作为 OnMapReady 回调的一部分显示。

      1. 改用TextureView 实现。这可以通过MapboxMapOptions.xml 属性启用。您还应该记住,此解决方案可能会导致性能问题。

      【讨论】:

        【解决方案3】:

        我尝试了@riastrad 提出的第一个解决方案,但我没有找到如何制作 mapView 的位图(我总是有一个底部带有 mapbox 徽标的白屏)。

        无论如何,我尝试使用setAlpha 来更改mapView 的不透明度,并且它有效。我真的不知道为什么它不适用于setVisibility(View.INVISIBLE)

        所以在加载 Fragment2 之前,我从 Fragment1 调用一个方法将 mapView 的不透明度设置为 0。

        MainActivity.java

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
                if(currentFragment instanceof Fragment1){
                    // Set the opacity of the mapView to 0
                    ((Fragment1) currentFragment).transition();
                    // Load Fragment2 containing a TextView
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment2()).addToBackStack(null).commit();
                }else {
                    getSupportFragmentManager().popBackStack();
                }
            }
        });
        

        Fragment1.java

        public void transition(){
            mapView.setAlpha(0f);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-04
          相关资源
          最近更新 更多