MapFragment:使用后退按钮后性能不佳

Ott*_*ger 6 android android-fragments mapfragment

MapFragment与操作栏菜单一起使用时出现性能问题.

当满足三个条件时,错误就会出现

  1. 有一个MapFragment实例化的.
  2. 从选项菜单触发片段事务,用另一个片段替换映射片段.
  3. 点击后退按钮返回地图片段.现在性能明显下降.平移和缩放非常不稳定.

再次打开选项菜单并再次解除它可以解决问题.

这种行为不会出现

  • 从视图按钮而不是从选项菜单触发片段替换.
  • 在中触发片段替换 onCreate()
  • 用选项菜单中的MapFragment替换空白片段
  • popBackStack从选项菜单调用
  • 使用ListFragment而不是MapView

最小的工作示例(需要访问Google Maps API):

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.maps.MapFragment;

public class MapFragmentBugActivity extends Activity {
    Fragment mMapFragment;
    String MAP = "Map";
    String BLANK = "Blank";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_bug);
        mMapFragment = new MapFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.main, mMapFragment)
                .commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(MAP);
        menu.add(BLANK);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Fragment fragment;

        if (item.getTitle().equals(MAP)) {
            fragment = mMapFragment;
        } else {
            fragment = new Fragment();
        }

        getFragmentManager()
                .beginTransaction()
                .replace(R.id.main, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

活动布局,没什么特别的

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
Run Code Online (Sandbox Code Playgroud)

Man*_*ani 13

片段事务在选项菜单关闭之前执行,这会导致奇怪的行为.

而不是直接执行片段事务,将其发布在Handler.关闭选项菜单后,将执行片段事务.

试试这个 :

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    final Fragment fragment;

    if (item.getTitle().equals(MAP)) {
        fragment = mMapFragment;
    } else { 
        fragment = new Fragment();
    } 

    Handler handler = new Handler();
    handler.post(new Runnable() {

        @Override
        public void run() {
            getFragmentManager()
            .beginTransaction()
            .replace(R.id.main, fragment)
            .addToBackStack(null)
            .commit();    
        }

    });     

    return true;
}
Run Code Online (Sandbox Code Playgroud)