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

时间:2014-08-07 11:54:56

标签: android android-fragments mapfragment

MapFragment与操作栏菜单一起使用时,我遇到了性能问题。

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

  1. 实例化MapFragment
  2. 从选项菜单中触发片段事务,将地图片段替换为另一个片段。
  3. 点击后退按钮并返回地图片段。现在性能明显下降。平移和缩放非常不稳定。
  4. 再次打开选项菜单并再次将其解除可以解决问题。

    时不会出现这种情况
    • 从视图按钮触发片段替换,而不是从选项菜单触发。
    • 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;
        }
    }
    

    活动布局,没什么特别的

    <?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" />
    

1 个答案:

答案 0 :(得分: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;
}