【问题标题】:Managing Fragments inside tabs管理选项卡内的片段
【发布时间】:2014-03-06 12:05:26
【问题描述】:

我正在创建一个简单的 Activity,其中包含两个选项卡。我关注documentation,所以我使用Fragment。 在我的活动中只有两个选项卡。第一个是 Map (MapFragment),第二个是简单的 List (ListFragment)

一切正常,我唯一的问题是我无法正确管理地图。

onTabSelected 回调中,我使用了以下代码:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if (mFragment == null) {
        mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
        ft.add(android.R.id.content, mFragment, mTag);
    } else {
        ft.attach(mFragment);

        if(mTag.compareToIgnoreCase("map")==0)
            setUpMapIfNeeded((MapFragment)mFragment);

    }
}

其中 map 是我的第一个 Activity 的标签,方法 setUpMapIfNeeded 是:

private static void setUpMapIfNeeded(MapFragment mMapFragment) {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        mMap = mMapFragment.getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        }
    }
}

因此,仅当我选择选项卡时,才会在地图中添加标记。

问题是:如何修改我的代码以在活动启动时也执行 addMarker 操作(无需明确按下第一个选项卡)?

【问题讨论】:

    标签: android google-maps android-fragments android-activity android-actionbar


    【解决方案1】:

    我已经解决了添加此代码:

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    
        FragmentManager fm = getFragmentManager();
        Fragment f = fm.findFragmentByTag("map");
        if(f!= null && f.isAdded())
            setUpMapIfNeeded((MapFragment)f);
    }
    

    【讨论】:

    • 是一种解决方案,但是每次调用 onResume 并添加地图时,您都会添加标记。如果你在某个时候有很多标记,这真的会减慢你的应用程序。
    【解决方案2】:

    我认为你可以:

    1. 重构onTabSelected的内容,调用一个addMapFragment(FragmentTransaction ft),把整个代码放到addMapFragment方法里面,返回FragmentTransaction。 onTabSelected 然后变成:

      public void onTabSelected(Tab tab, FragmentTransaction ft) {
          // if map tab
          ft = addMapFragment(ft);
      }
      
    2. 这将使在 onCreate 中处理地图和标记变得容易:

      protected void onCreate(Bundle savedInstanceState) {
          ...
          if (savedInstanceState != null) {
              // not first startup - map should already be created with markers
          } else {
              FragmentTransaction ft = getFragmentMangager.beginTransaction();
              ft = addMapFragment(ft);
              ft.commit();
          }
      }
      

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2013-07-09
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多