9

我正在尝试在操作栏中使用选项卡时检索 Google 地图片段。当我加载选项卡式页面时,地图加载正常,但我想获取地图对象,以便将其居中、添加标记等。

有没有办法做到这一点,如果有的话,有人会这么好心告诉我怎么做吗?

这是我的标签页的代码...

我正在使用的具体方法是public static class Map extends Fragment

public class Page3Activity extends FragmentActivity implements ActionBar.TabListener {  

    final Context context = this;
    static GoogleMap map;
    static MapView mMapView;
    DatabaseHandler db = new DatabaseHandler(context);

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    ViewPager mViewPager;

    @SuppressLint("NewApi")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
        setContentView(R.layout.page3);

        // Create the adapter that will return a fragment for each of the three primary sections
        // of the app.
        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

        ColorDrawable colorDrawable = new ColorDrawable();
        final ActionBar actionBar = getActionBar();
        colorDrawable.setColor(0xff9ACC00);
        actionBar.setBackgroundDrawable(colorDrawable);
        actionBar.setTitle("Road Trip Calculator");
        actionBar.setSubtitle("Trip Information");
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE );

     // Specify that the Home/Up button should not be enabled, since there is no hierarchical
        // parent.
        actionBar.setHomeButtonEnabled(false);

        // Specify that we will be displaying tabs in the action bar.
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Set up the ViewPager, attaching the adapter and setting up a listener for when the
        // user swipes between sections.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                // When swiping between different app sections, select the corresponding tab.
                // We can also use ActionBar.Tab#select() to do this if we have a reference to the
                // Tab.
                actionBar.setSelectedNavigationItem(position);
            }
        });

        // For each of the sections in the app, add a tab to the action bar.
        for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {
            // Create a tab with text corresponding to the page title defined by the adapter.
            // Also specify this Activity object, which implements the TabListener interface, as the
            // listener for when this tab is selected.
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }

    }

    /*
     * ACTIONBAR TOP BAR CODE
     */


    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary
     * sections of the app.
     */
    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

        public AppSectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        //Switching between tabs
        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:
                    return new Map();
                case 1:
                    return new Directions();
                case 2:
                    return new poiList();
                case 3:
                    return new tripInfo();
                default:
                    i=i+1;
            }
            return null;
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public String getPageTitle(int position) {
            String tabName = "";
            if(position == 0) {
                tabName = "Map";
            } else if(position == 1) {
                tabName = "Directions";
            } else if(position == 2) {
                tabName = "POI List";
            } else if(position == 3) {
                tabName = "Trip Info";
            }
            return tabName;

        }
    }

    /**
     * Map
     */
    public static class Map extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.maptab, container, false);

            //I want to be able to do something like this...
            /* 
            GoogleMap map;
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map1);
            map = fm.getMap();
            map.DOSOMETHING
            */


            return rootView;
        }
    }

    /**
     * Directions
     */

    public static class Directions extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.directionstab, container, false);
                ((TextView) rootView.findViewById(android.R.id.text1)).setText(
                "directions");
            return rootView;
        }
    }

    /**
     * POI List
     */

    public static class poiList extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.poitab, container, false);
                ((TextView) rootView.findViewById(android.R.id.text1)).setText(
                "poiList");
            return rootView;
        }
    }

    /**
     * Trip Info
     */

    public static class tripInfo extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tripinfotab, container, false);
            ((TextView) rootView.findViewById(android.R.id.text1)).setText(
            "Trip Info");
            return rootView;
        }
    }

}

这是我的 XML 文件 (maptab.xml),其中有我的地图片段...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

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

</LinearLayout>

解决了

    public static class Map extends Fragment {
        MapView mapView;
        GoogleMap map;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.maptab, container, false);

            // Gets the MapView from the XML layout and creates it
            mapView = (MapView) v.findViewById(R.id.mapview);
            mapView.onCreate(savedInstanceState);

            // Gets to GoogleMap from the MapView and does initialization stuff
            map = mapView.getMap();
            //map.getUiSettings().setMyLocationButtonEnabled(false);
            //map.setMyLocationEnabled(true);
            map.addMarker(new MarkerOptions().position(new LatLng(50.167003,19.383262)));


            // Needs to call MapsInitializer before doing any CameraUpdateFactory calls
            try {
                MapsInitializer.initialize(this.getActivity());
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            }

            // Updates the location and zoom of the MapView
            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10);
            map.animateCamera(cameraUpdate);

            return v;
        }

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

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

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

1 回答 1

2

您可以使用获取对包含您的地图的片段的引用mViewPager.getItem(0),然后将其转换为Map片段并以您喜欢的任何方式使用它。但这实际上不是从外部对片段进行操作的很好的设计。因此,我建议您在Map片段内实现与地图相关的所有业务逻辑,这样您就不需要解决您发布的那种问题,并且您所有的业务逻辑都封装在一个可移植的片段中。

于 2013-07-23T21:02:11.167 回答