在带有导航抽屉的子类活动中使用Google Maps v2

时间:2015-01-19 18:56:51

标签: android google-maps android-fragments android-appcompat

我需要回到API级别8.我有多个活动,并且使用导航抽屉在它们之间移动以及操作栏(使用AppCompat v7)。我创建了一个基本抽象类,它具有所有导航抽屉设置和处理,并且来自ActionBarActivity。

文件BaseNavActivity.java

abstract class BaseNavActivity extends ActionBarActivity {
}

我的所有活动都是BaseNavActivity的子类,它们都可以正常工作。

public class MainActivity extends BaseNavActivity {
}

在我添加导航抽屉功能之前,我从FragmentActivity下载时可以正常使用地图。但是,我不能再这样做,因为我需要从我的BaseNavActivity下降。即使文档说ActionBarActivity来自FragmentActivity,我在尝试使用这个XML时也会遇到错误。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background" >

    <!-- The main content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background"
        android:orientation="vertical"
        >

        <include layout="@layout/common_toolbar" />

        <fragment
            android:id="@+id/map"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingTop="3dip"
            />

        <include layout="@layout/common_footer" />
    </LinearLayout> 
    <!-- The navigation drawer -->
    <include layout="@layout/nav_menu" />
</android.support.v4.widget.DrawerLayout>

我收到InflateException:二进制XML文件行#19:错误导致类片段。

我尝试了其他解决方案,例如只使用单独的XML文件并将其作为片段打开,并将其添加到上面代替。当我试图指向地图时,该方法总是返回null(smf始终为null):

SupportMapFragment smf = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

我也尝试过

public class MapFragment extends FragmentActivity {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View myFragmentView = inflater.inflate(R.layout.location_map, container, false);

        return myFragmentView;
    }

}

但我无法使用

添加片段
MapFragment mapFragment = new MapFragment();
fragmentTransaction.add(R.id.map_container, mapFragment);
fragmentTransaction.commit();

add()函数需要参数为(int,Fragment)。

任何帮助将不胜感激。如果您需要更多代码,我可以添加它,但不想让这篇文章过长。我花了几天的时间搜索并尝试各种方法,似乎没有什么能让一切都在一起工作。

基本上我想知道如何从源自ActionBarActivity的自定义子类降序时在XML中有<fragment>。我的第二选择是知道如何添加一个包含地图的片段并与支持库一起使用。

谢谢!

1 个答案:

答案 0 :(得分:0)

我终于找到了我的问题。我采用了不同的搜索方法,找到了这个宝石:Android Google Maps V2 Caused by: java.lang.ClassCastException: com.google.android.gms.maps.SupportMapFragment cannot be cast to android.app.Fragment

基本上我的问题是在调用super.onCreate之前我有自定义基类调用setContentView。这意味着碎片不被理解,因为它是一对了解它们的超级迷。这抓住了我,因为1)我需要指定一个appcompat可以使用的主题,当我将东西复制到基类时,我的setContentView就在它旁边,2)其他所有工作到此为止所以我没有意识到这是不正确的。

因此修复在我的基类中,我的所有活动都继承自(缩写):

abstract class BaseNavActivity extends ActionBarActivity {
    protected void onCreate(Bundle savedInstanceState, int resLayout) {

        // need to set the theme first
        setTheme(R.style.AppTheme2);

        // then call super before setting the content view
        super.onCreate(savedInstanceState);

        setContentView(resLayout);
    }
}