以编程方式设置谷歌地图片段的可见性(API2)

28

XML:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mapFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>

在常规片段中,它的表现方式如下:

  mFragment = (mFragment) (getSupportFragmentManager().findFragmentById(R.id.mFragment));
  mFragment.getView().setVisibility(View.INVISIBLE);
在Google地图碎片中:
  mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment)).getMap();

但是我如何通过编程方式设置地图片段的可见性呢?

不能像其他片段那样操作。


1
你可以尝试将 mMap 强制转换为 Fragment 并执行相同的 getView().setVisibility(View.INVISIBLE),因为 SupportMapFragment 仍然是一个 fragment。 - Evos
无法将GoogleMap转换为Fragment。 - David
你尝试使用过 getSupportFragmentManager().beginTransacton().hide(mMap).commit() 或者 getSupportFragmentManager().beginTransacton().detach(mMap).commit() 吗? - Evos
尝试过,但没有成功。只要地图声明为:private GoogleMap mMap; 我就会得到以下提示信息:"在FragmentTransaction中,hide/detach(Fragment)方法不适用于参数(GoogleMap)"。 - David
抱歉我的错,试一下这个代码:getSupportFragmentManager().beginTransacton().hide(getSupportFragmentManager().findFragmentById(R.id.mapFragment)).commit() 或者 getSupportFragmentManager().findFragmentById(R.id.mapFragment).getView().setVisibility(View.INVISIBLE); - Evos
5个回答

66

就这么简单:

private GoogleMap mMap;
private SupportMapFragment mMapFragment;

mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();

mMapFragment.getView().setVisibility(View.INVISIBLE);

3
这篇文章帮助我搞清楚了如何通过编程方式改变支持地图片段的高度。谢谢!https://dev59.com/IGEi5IYBdhLWcg3wPKWx#21483722 - loeschg
1
如果地图在ScrollView中,当我隐藏我的ScrollView时,地图不会隐藏。如果我在ScrollView之前隐藏地图,它仍然不会隐藏。我必须隐藏地图,等待1毫秒,然后使用计时器隐藏ScrollView。 - melanke

22
您可以做:

getSupportFragmentManager().beginTransaction().hide(mFragment).commit();

展示它:

getSupportFragmentManager().beginTransaction().show(mFragment).commit();

1

答案由@David@ferdy182都是正确的,但他们没有提供上下文。

如果您要通过编程方式隐藏/显示片段,则使用@ferdy182;如果您想要隐藏/显示xml中的片段,则应遵循@David的方法。

让我解释一下

如果您在xml中有一个单独的frameLayout,并且希望在其中替换其他片段,则使用此代码添加所有片段。它们将彼此叠放。

for(int i=0;i<4;i++)
        {
            getFragmentManager().beginTransaction().add(R.id.container, frag[i])
            //.addToBackStack(null)
            .commit();
        }// add all these fragment and put them on each other then 

隐藏除了你想显示的片段之外的所有其他片段。

for(int j=0;j<4;j++)
        {
        getFragmentManager().beginTransaction().hide(frag[j]).commit();
        }
        getFragmentManager().beginTransaction().show(frag[0]).commit();

好处 这些片段的工作方式类似于C#中的表单。Forum.show和forum.hide(); 其中它们的当前状态保持不变。这些片段不会反复调用。我使用这种技术解决了一个问题。 第二种方法

当您在xml中有多个frameLayout或片段时,可以通过获取其ID来隐藏特定的片段。

private GoogleMap mMap;
private SupportMapFragment mMapFragment;

mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();

mMapFragment.getView().setVisibility(View.INVISIBLE);

代码

// 当片段被隐藏时显示它

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
          .show(fragment1)
          .commit();

// 隐藏片段

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
          .hide(fragment1)
          .commit();

你不应该通过更改其可见性来隐藏它。hide和show也适用于在xml中定义的片段,你只需要通过findFragmentById来传递片段实例到片段事务即可。 - Fernando Gallego

0

只有这个对我有效:

View fragmentMap = layout.findViewById(R.id.map_fragment_container_id);
fragmentMap.setVisibility(View.GONE);

0

不必在xml中创建SupportMapFragment,还有另一种方法可以定义一个容器来装载SupportMapFragment,然后从类中加载地图。

在XML中,假设容器是FrameLayout-

    <FrameLayout
        android:id="@+id/mapContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

在我的Java类中,它是一个Fragment,我创建了两个方法来显示和隐藏地图。我使用了detach并且这取决于需要。我们也可以使用hide而不是detach。
   private void showMap() {
   mMapContainer.setVisibility(View.VISIBLE);
   mSupportMapFragment = SupportMapFragment.newInstance();
   getChildFragmentManager().beginTransaction()
                         .replace(R.id.mapContainer, mSupportMapFragment).commit();
   }

    private void hideMap() {
        mMapContainer.setVisibility(View.VISIBLE);
        if (mSupportMapFragment != null) {
            getChildFragmentManager().beginTransaction()
                                 .detach(mSupportMapFragment).commit();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接