Android 暂停后,“地图输入”选项卡将冻结(&A);简历

Android 暂停后,“地图输入”选项卡将冻结(&A);简历,android,Android,我正在使用actionbarsherlock实现一组选项卡。其中一个选项卡是包含MapView的片段。我的onCreateView如下所示: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.mapview, container, false); mMapV

我正在使用actionbarsherlock实现一组选项卡。其中一个选项卡是包含MapView的片段。我的onCreateView如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.mapview, container, false);
    mMapView = (MapView) view.findViewById(R.id.mapv);
    mMapView.onCreate(savedInstanceState);
    mMapView.onResume();

    try
    {
        MapsInitializer.initialize(getActivity());
    }
    catch (GooglePlayServicesNotAvailableException e)
    {
        e.printStackTrace();
    }

    googleMap = mMapView.getMap();
    googleMap.getUiSettings().setMyLocationButtonEnabled(true);

    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS, 10));

    googleMap.addMarker(new MarkerOptions().position(PARIS).title("Paris").snippet("Great city"));

    return view;
}
如您所见,地图最初显示在巴黎的放大图上,上面有一个标记。到目前为止一切正常。我看到地图,可以手动拖动和缩放地图。如果我按下手机侧面的按钮使其暂停,然后解锁手机继续,我仍然可以拖动和缩放。但是如果我切换到另一个选项卡,然后返回到“贴图”选项卡,我会在离开时看到贴图,但它不再响应拖动/缩放。它似乎冻结了。但是我的日志中没有显示错误,我仍然可以在选项卡之间切换

没有任何日志错误,我不知道如何跟踪问题

编辑:我正在使用地图v2

编辑:我刚刚发现了类似的情况。这很可能是答案,但我不知道建议的解决方案中的代码应该放在哪里

编辑:以防关键代码不在我的代码段中,以下是全部内容

package com.mycompany.myapp;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.ActionBar.TabListener;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import android.view.View;

public class TestMapFragment extends Fragment implements TabListener
{
    private Fragment mFragment;
    private MapView mMapView;
    private GoogleMap googleMap;
    private static final LatLng PARIS = new LatLng(48.874,2.347);

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.mapview, container, false);
        mMapView = (MapView) view.findViewById(R.id.mapv);
        mMapView.onCreate(savedInstanceState);
        mMapView.onResume();

        try
        {
            MapsInitializer.initialize(getActivity());
        }
        catch (GooglePlayServicesNotAvailableException e)
        {
            e.printStackTrace();
        }

        googleMap = mMapView.getMap();
        googleMap.getUiSettings().setMyLocationButtonEnabled(true);

        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS, 10));

        googleMap.addMarker(new MarkerOptions().position(PARIS).title("Paris").snippet("Great city"));

        return view;
    }


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


    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft)
    {
        mFragment = new TestMapFragment();
        ft.add(android.R.id.content, mFragment);
        ft.attach(mFragment);
    }


    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    /*
     * Using a mapview in a fragment requires you to 'route'
     * the lifecycle events of the fragment to the mapview
     */

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

        if (mMapView != null)
        {
            mMapView.onResume();
        }
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mMapView != null)
        {
            mMapView.onPause();
        }
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (mMapView != null)
        {
            mMapView.onDestroy();
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        if (mMapView != null)
        {
            mMapView.onSaveInstanceState(outState);
        }
    }

    @Override
    public void onLowMemory()
    {
        super.onLowMemory();
        if (mMapView != null)
        {
            mMapView.onLowMemory();
        }
    }

}

您是否尝试过在
mMapView=(MapView)视图之后立即使用
mMapView.displayZoomControl(true)
我做过类似的事情

将保存片段的片段活动

Map_main_screen.java

public class Map_main_screen extends FragmentActivity {
    private static final String[] CONTENT = new String[] { "TAB one",
            "Second tab GOOGLE MAP", };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
                setContentView(R.layout.map_new);
        FragmentPagerAdapter adapter = new GoogleMusicAdapter(
                getSupportFragmentManager());

        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);
        TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
        indicator.setViewPager(pager);

==========================new_class_GoogleMusicAdapter============================
    class GoogleMusicAdapter extends FragmentPagerAdapter {
        public GoogleMusicAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return Map_google_TestFragment.newInstance(CONTENT[position
                    % CONTENT.length]);

        }

        @Override
        public CharSequence getPageTitle(int position) {
            return CONTENT[position % CONTENT.length].toUpperCase();
        }

        @Override
        public int getCount() {
            return CONTENT.length;
        }
    }
    // =================adapter ends here===============================
}
Map\u google\u TestFragment.java

  public final class Map_google_TestFragment extends Fragment {
        private static final String KEY_CONTENT = "TestFragment:Content";
        Typeface tf;

        public static Map_google_TestFragment newInstance(String content) {
    Map_google_TestFragment fragment = new  Map_google_TestFragment();

            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < 1; i++) {
                builder.append(content).append(" ");
            }
            builder.deleteCharAt(builder.length() - 1);
            fragment.mContent = builder.toString();

            return fragment;
        }


        private String mContent = "???";
        private int[] mICONS = { 1 };

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

            if ((savedInstanceState != null)
                    && savedInstanceState.containsKey(KEY_CONTENT)) {
                mContent = savedInstanceState.getString(KEY_CONTENT);
            }
        }

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

            LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            View v;
            if (mContent.toString().equals("TAB one")) {
                v = vi.inflate(R.layout.YOUR_SECOND_LAYOUT, null);

                          //***************************************
                          // function related to your first fragment 
                          //***************************************

            } else {

                          //***************************************
                          // inflate your Google  map layout here 
                          // function related to your Second fragment 
                          //***************************************
                    View view = inflater.inflate(R.layout.mapview, container, false); //INFLATE GOOGLE MAP LAYOUT
                     mMapView = (MapView) view.findViewById(R.id.mapv); 
                    mMapView.onCreate(savedInstanceState);
                     mMapView.onResume();

                   try
                   {
                     MapsInitializer.initialize(getActivity());
                    }
                   catch (GooglePlayServicesNotAvailableException e)
                    {
                     e.printStackTrace();
                    }

                    googleMap = mMapView.getMap();
                    googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS, 10));

                    googleMap.addMarker(new MarkerOptions().position(PARIS).title("Paris").snippet("Great city"));

                    return view;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString(KEY_CONTENT, mContent);
        }

    }
public final class Map\u google\u TestFragment扩展片段{
私有静态最终字符串KEY\u CONTENT=“TestFragment:CONTENT”;
字体tf;
公共静态映射\u google\u测试片段newInstance(字符串内容){
Map_google_TestFragment=新的Map_google_TestFragment();
StringBuilder=新的StringBuilder();
对于(int i=0;i<1;i++){
builder.append(content).append(“”);
}
builder.deleteCharAt(builder.length()-1);
fragment.mContent=builder.toString();
返回片段;
}
私有字符串mContent=“???”;
私有int[]mICONS={1};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果((savedInstanceState!=null)
&&savedInstanceState.containsKey(关键字内容)){
mContent=savedInstanceState.getString(键内容);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
LayoutFlater vi=(LayoutFlater)getActivity().getSystemService(
上下文。布局(充气机和服务);
观点五;
if(mContent.toString().equals(“制表符一”)){
v=vi.充气(R.布局。您的第二个布局,空);
//***************************************
//与第一个片段相关的函数
//***************************************
}否则{
//***************************************
//在这里放大你的谷歌地图布局
//与第二个片段相关的函数
//***************************************
视图=充气器。充气(R.layout.mapview,container,false);//充气谷歌地图布局
mMapView=(MapView)view.findviewbyd(R.id.mapv);
mMapView.onCreate(savedInstanceState);
mMapView.onResume();
尝试
{
初始化(getActivity());
}
捕获(谷歌PlayServicesNotAvailableException)
{
e、 printStackTrace();
}
googleMap=mMapView.getMap();
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(巴黎,10));
googleMap.addMarker(新MarkerOptions().position(巴黎).title(“巴黎”).snippet(“大城市”);
返回视图;
}
@凌驾
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
outState.putString(KEY_CONTENT,mContent);
}
}

我也有同样的问题 我做过类似的事情

将保存片段的片段活动

Map_main_screen.java

public class Map_main_screen extends FragmentActivity {
    private static final String[] CONTENT = new String[] { "TAB one",
            "Second tab GOOGLE MAP", };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
                setContentView(R.layout.map_new);
        FragmentPagerAdapter adapter = new GoogleMusicAdapter(
                getSupportFragmentManager());

        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);
        TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
        indicator.setViewPager(pager);

==========================new_class_GoogleMusicAdapter============================
    class GoogleMusicAdapter extends FragmentPagerAdapter {
        public GoogleMusicAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return Map_google_TestFragment.newInstance(CONTENT[position
                    % CONTENT.length]);

        }

        @Override
        public CharSequence getPageTitle(int position) {
            return CONTENT[position % CONTENT.length].toUpperCase();
        }

        @Override
        public int getCount() {
            return CONTENT.length;
        }
    }
    // =================adapter ends here===============================
}
Map\u google\u TestFragment.java

  public final class Map_google_TestFragment extends Fragment {
        private static final String KEY_CONTENT = "TestFragment:Content";
        Typeface tf;

        public static Map_google_TestFragment newInstance(String content) {
    Map_google_TestFragment fragment = new  Map_google_TestFragment();

            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < 1; i++) {
                builder.append(content).append(" ");
            }
            builder.deleteCharAt(builder.length() - 1);
            fragment.mContent = builder.toString();

            return fragment;
        }


        private String mContent = "???";
        private int[] mICONS = { 1 };

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

            if ((savedInstanceState != null)
                    && savedInstanceState.containsKey(KEY_CONTENT)) {
                mContent = savedInstanceState.getString(KEY_CONTENT);
            }
        }

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

            LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            View v;
            if (mContent.toString().equals("TAB one")) {
                v = vi.inflate(R.layout.YOUR_SECOND_LAYOUT, null);

                          //***************************************
                          // function related to your first fragment 
                          //***************************************

            } else {

                          //***************************************
                          // inflate your Google  map layout here 
                          // function related to your Second fragment 
                          //***************************************
                    View view = inflater.inflate(R.layout.mapview, container, false); //INFLATE GOOGLE MAP LAYOUT
                     mMapView = (MapView) view.findViewById(R.id.mapv); 
                    mMapView.onCreate(savedInstanceState);
                     mMapView.onResume();

                   try
                   {
                     MapsInitializer.initialize(getActivity());
                    }
                   catch (GooglePlayServicesNotAvailableException e)
                    {
                     e.printStackTrace();
                    }

                    googleMap = mMapView.getMap();
                    googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS, 10));

                    googleMap.addMarker(new MarkerOptions().position(PARIS).title("Paris").snippet("Great city"));

                    return view;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString(KEY_CONTENT, mContent);
        }

    }
public final class Map\u google\u TestFragment扩展片段{
私有静态最终字符串KEY\u CONTENT=“TestFragment:CONTENT”;
字体tf;
公共静态映射\u google\u测试片段newInstance(字符串内容){
Map_google_TestFragment=新的Map_google_TestFragment();
StringBuilder=新的StringBuilder();
对于(int i=0;i<1;i++){
builder.append(content).append(“”);
}
builder.deleteCharAt(builder.length()-1);
fragment.mContent=builder.toString();
返回片段;
}
私有字符串mContent=“???”;
私有int[]mICONS={1};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果((savedInstanceState!=null)
&&savedInstanceState.containsKey(关键字内容)){
mContent=savedInstanceState.getString(键内容);
}