android - 使用 ActionBar 选项卡在 onCreateView 中获取 Google Map Fragment

标签 android android-actionbar google-maps-android-api-2

我在 ActionBar 中使用 Tabs 时试图检索 Google Map fragment 。当我加载选项卡式页面时, map 加载正常,但我想获取 map 对象,以便我可以将其居中、添加标记等。

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

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

我正在使用的具体方法是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),我的 map fragment 在...

<?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();
        }
    }

最佳答案

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

关于android - 使用 ActionBar 选项卡在 onCreateView 中获取 Google Map Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17820880/

相关文章:

android - 如何一个接一个地连续加载URL

Android studio 无法解析 ActionBarActivity

javascript - Phonegap - Android 4.4 - html5 音频长度错误(javascript 和媒体插件)

android - 在 SettingsActivity 中使用支持库中的 ActionBar

android - 使用 AppCompat-Theme 和 Activity 时不显示操作栏

android - 从 ClusterManager 获取标记

android - 从 Android 中的谷歌地图清除标记

android - 如何获取两站之间的所有巴士站名称?

java - 我们如何在Java中将livedata添加到spinner中

Android:淡入淡出 View