使用ActionBarSherlock与SupportMapFragment的子类在选项卡式导航中

时间:2012-12-07 13:24:14

标签: android android-fragments actionbarsherlock android-maps

有关其工作原理的详细信息,请参阅我的previous question

当前设置

我在SherlockMapFragment(ABS)库中创建了一个名为ActionBarSherlock的类,它扩展了SupportMapFragment。这样可以很好地显示地图等,直到现在我才意识到(因为我是个白痴)以下内容:

  • 我创建了一个名为mapFrag的SherlockMapFragment实例。
  • 然后使用并显示这个我调用mapFrag.newInstance()。

这实际上做的是返回一个SupportMapFragment实例,但是这个调用对于显示MapView是必要的。

这是我想要实现的一个巨大的问题,因为我试图将我的片段添加到选项卡式导航栏中,但显然我无法将SupportMapFragment添加到TabListener,因为我得到了各种类型的类型异常等,因为它期望SherlockFragmentFragment的扩展。

有人能看到这方面的方法吗?或者如果我需要让自己更清楚,请问问题。

一种可能的解决方案

一种解决方案是创建自己的标签栏并自己处理Fragments的事务。但是,这些工具已经存在,如果只是一个简单的修复,我真的不想这样做。

提前致谢

2 个答案:

答案 0 :(得分:3)

你可以扩展SherlockFragment并自己处理MapView。这看起来像......

public class SherlockMapFragment extends SherlockFragment
{
private MapView mapView;

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    mapView = (MapView) getView().findViewById(R.id.my_map_id);
    mapView.onCreate(savedInstanceState);
}

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

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

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

@Override
public void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

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

没有什么说你绝对必须使用SupportMapFragment。新API最酷的部分之一是能够将MapView用作普通视图。

答案 1 :(得分:0)

试试这个

公共类BysFragmentActivity扩展了SherlockFragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    Tab tab = actionBar.newTab()
            .setText("Mapa 1")
            .setTabListener(new TabListener<BySMapFragment>(this, "mapa", BySMapFragment.class));
    actionBar.addTab(tab);
    tab = actionBar.newTab()
            .setText("Mapa 2")
            .setTabListener(new TabListener<BySMapFragment>(this, "mapa", BySMapFragment.class));
    actionBar.addTab(tab);

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
}

@Override
public void onAttachFragment(android.support.v4.app.Fragment fragment) {
    super.onAttachFragment(fragment);
}

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {

    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

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

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

}

}