【问题标题】:Google Map Nested Fragment does not show up谷歌地图嵌套片段不显示
【发布时间】:2014-07-21 05:35:07
【问题描述】:

所以我目前正在做一个导航应用程序,我需要在其中显示几个选项卡,其中一个显示谷歌地图。

我已经使用 FragmentPagerAdapter 来设置多页 UI,到目前为止,剩下的 2 个片段没有实现任何其他嵌套片段,它工作得很好。

对于地图片段,我注意到了嵌套片段的问题,所以我按照这个指南:https://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1 并将相应的东西放入我的 MapFragment 中,但是,片段没有显示任何东西,它只是一个空白页面(我在那个片段中还有一些其他的东西,而不仅仅是谷歌地图片段)。

请看我哪里出错了,非常感谢:)如果您需要代码的任何其他部分,请告诉我。

这是地图片段的代码

public class MapFragment extends FragmentControl  implements OnSeekBarChangeListener{
public static MapFragment getInstance() {
        if(MapFragment.instance==null) {
            Log.e(TAG,"Map Fragment is not loaded");
        }
        return MapFragment.instance;
    }
public static MapFragment newInstance(int position, String title){
    MapFragment mapFragment = new MapFragment();
    Bundle args = new Bundle();
    args.putInt("current_page", 1);
    args.putString("page_tile", "Map Information");
    mapFragment.setArguments(args);
    return mapFragment;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mCurrentPage = getArguments().getInt("current_page", 1);
        pageTitle = getArguments().getString("page_title");
        MapFragment.instance=this;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    layout = inflater.inflate(R.layout.map, container, false);
    if (layout==null){
        Log.d(TAG,"layout null");
        return null;
    }
    CheckBox camera = (CheckBox)layout.findViewById(R.id.cameraMove);
    camera.setChecked(MapFragment.moveCamera);
    camera.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            MapFragment.moveCamera = isChecked;
        }
    });;
    mTransparencyBar = (SeekBar)layout.findViewById(R.id.transparencySeekBar);
    mTransparencyBar.setMax(TRANSPARENCY_MAX);
    mTransparencyBar.setProgress(0);
    markerList = new ArrayList<Marker>();
    return layout;
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm = getChildFragmentManager();
    supportfragment = (SupportMapFragment) fm.findFragmentById(R.id.googlemap);
    if (supportfragment == null) {
        supportfragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.googlemap, supportfragment).commit();
        fm.executePendingTransactions();
    }
}

@Override
public void onResume() {
    super.onResume();
    this.createUiMap();
    mapTimer = new Timer();
    mapTimer.scheduleAtFixedRate(new updateCalculationTask(), 0, 100);
    mapTimer.scheduleAtFixedRate(new updateUITask(), 50, MainActivity.uiUpdateRate);    
}
void createUiMap() {
         if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = supportfragment.getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
                populateMapStartPointsSpinner(layout);
                setStartPointSpinnerListener(layout);
                this.setUpMarker(this.defaultStartPoint.x, this.defaultStartPoint.y);
                FetchSQL.setDRFixData(this.setLocation(defaultStartPoint));
             }
        }
    }

private void setUpMap() {
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(NEWARK, 20));
        mImages.add(BitmapDescriptorFactory.fromResource(R.drawable.i3f2));
        mCurrentEntry = 0;
        LatLngBounds newarkBounds = new LatLngBounds(
                new LatLng(1.291926, 103.775114),       // South west corner
                new LatLng(1.292833, 103.776310));      // North east corner
        mGroundOverlay = mMap.addGroundOverlay(new GroundOverlayOptions()
                 .image(mImages.get(mCurrentEntry))
                 .positionFromBounds(newarkBounds));
        mTransparencyBar.setOnSeekBarChangeListener(this);
    }
}

这是 map.xml 文件

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



    <CheckBox
        android:id="@+id/cameraMove"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cameraMove"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/mapStartPointSpinnerLabel"
        android:layout_marginLeft="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/cameraMove"
        android:layout_toRightOf="@id/cameraMove"
        android:text="@string/mapStartPointSpinnerLabel" />


    <Spinner
        android:id="@+id/mapStartPointSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/cameraMove"
        android:layout_toRightOf="@id/mapStartPointSpinnerLabel" />

 <LinearLayout
     android:id="@+id/seekbarmenu"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_below="@id/mapStartPointSpinnerLabel"
     android:orientation="horizontal"
     android:layout_marginTop="15dip">

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/transparency"
         android:layout_gravity="center_vertical" />
     <SeekBar
      android:id="@+id/transparencySeekBar"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"/>
 </LinearLayout>

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_below="@id/seekbarmenu"
      android:layout_marginTop="15dip" >

    <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dip"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/googlemap" />
  </LinearLayout>

它应该是什么样子(在 Eclipse 视图中):

我手机上的情况:

更新:在网上浏览了一段时间后,我怀疑问题来自代码的膨胀部分(如果不是至少它应该显示一些东西)。可能是在inflate a Relative layout,你需要一些特殊的代码而不是inflate Linear Layout。 我找到的所有代码都是针对 Activity 膨胀的,如果有人知道如何在 Fragment 中膨胀相对布局,请提供帮助。谢谢你:)

【问题讨论】:

标签: android google-maps android-layout android-fragments android-nested-fragment


【解决方案1】:

来自android developers

注意:当布局包含 时,您不能将布局扩展为片段。只有动态添加到片段时才支持嵌套片段。

所以,不要使用 元素,而是使用一些容器视图(例如 FrameLayout)来动态添加片段

【讨论】:

  • 我将 更改为 但它仍然显示空白页面,如果谷歌地图嵌套片段是这里的问题,那么当我膨胀布局时它应该仍然显示其他组件对吗?
  • 曾经调用过 MapFragment 的 onCreateView 吗?
【解决方案2】:

更新:我的问题来自最意想不到的地方,我在 MapFragment 中声明了一个 getView() 函数,该函数似乎覆盖了 Fragment 类中的一个函数,并且该部分的一切都出错了。只需删除该功能,它就会像冠军一样工作。

这确实向我表明错误可能来自您不期望的地方(我所做的是将整个事情注释掉,然后逐块测试,直到找到导致我的程序出错的部分)。 非常感谢其他人回复我。非常感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2020-02-14
    • 2014-01-02
    • 1970-01-01
    • 2020-04-03
    • 2019-03-27
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多