Android studio:将googlemap集成为片段:错误膨胀类片段

时间:2016-04-22 14:47:49

标签: java android google-maps android-fragments

我正在尝试使用加载不同片段的幻灯片菜单开发Android应用。 一个片段是谷歌地图。

当应用程序启动时,地图片段正在加载。 但是当我使用slidemenu切换片段并返回到地图片段时,应用程序崩溃。

有什么想法吗?非常感谢

我在logcat中收到此消息错误:

04-22 16:26:12.354 10759-10759/me.eazypark.eazypark E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: me.eazypark.eazypark, PID: 10759
                                                                  android.view.InflateException: Binary XML file line #6: Error inflating class fragment
                                                                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:720)
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
                                                                      at me.eazypark.eazypark.fragment.Fragment1.onCreateView(Fragment1.java:19)
                                                                      at android.app.Fragment.performCreateView(Fragment.java:1700)
                                                                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
                                                                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
                                                                      at android.app.BackStackRecord.run(BackStackRecord.java:684)
                                                                      at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
                                                                      at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
                                                                      at android.os.Handler.handleCallback(Handler.java:733)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:136)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5426)
                                                                      at java.lang.reflect.Method.invokeNative(Native Method)
                                                                      at java.lang.reflect.Method.invoke(Method.java:515)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
                                                                      at dalvik.system.NativeStart.main(Native Method)
                                                                   Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f0c007d, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment
                                                                      at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2293)
                                                                      at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
                                                                      at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
                                                                      at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
                                                                      at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80)
                                                                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:762) 
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:499) 
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
                                                                      at me.eazypark.eazypark.fragment.Fragment1.onCreateView(Fragment1.java:19) 
                                                                      at android.app.Fragment.performCreateView(Fragment.java:1700) 
                                                                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
                                                                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
                                                                      at android.app.BackStackRecord.run(BackStackRecord.java:684) 
                                                                      at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
                                                                      at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
                                                                      at android.os.Handler.handleCallback(Handler.java:733) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                      at android.os.Looper.loop(Looper.java:136) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5426) 
                                                                      at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                      at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                                                                      at dalvik.system.NativeStart.main(Native Method) 

这是我的档案:

-Manifest:     

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-permission android:name="com.myapp.android.locationapi.maps.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SubscribeActivity" >
    </activity>
    <activity android:name=".ProfileActivity" >
    </activity>

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_app_id" />
</application>

-ProfilActivity(包含菜单并且必须显示不同的片段):

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;

import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AlertDialog;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.content.SharedPreferences;
import android.content.Intent;



import me.eazypark.eazypark.fragment.Fragment1;
import me.eazypark.eazypark.fragment.Fragment2;
import me.eazypark.eazypark.fragment.Fragment3;

import java.util.ArrayList;
import java.util.List;



public class ProfileActivity extends AppCompatActivity{

private List<ItemSlideMenu> listSliding;
private SlidingMenuAdapter adapter;
private ListView listViewSliding;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle actionBarDrawerToggle;

public static android.support.v4.app.FragmentManager fragmentManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    //Init component
    listViewSliding = (ListView) findViewById(R.id.lv_sliding_menu);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    listSliding = new ArrayList<>();

    fragmentManager = getSupportFragmentManager();

    //Add item for sliding list
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_map, "Map"));
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_account, "Account"));
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_logout, "Logout"));
    adapter = new SlidingMenuAdapter(this, listSliding);
    listViewSliding.setAdapter(adapter);

    //Display icon to open/ close sliding list
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //Set title
    setTitle(listSliding.get(0).getTitle());
    //item selected
    listViewSliding.setItemChecked(0, true);
    //Close menu
    drawerLayout.closeDrawer(listViewSliding);

    //Display fragment 1 when start
    replaceFragment(0);

    //Fetching email from shared preferences
    SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    String email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");

    //Hanlde on item click
    listViewSliding.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //Set title
            setTitle(listSliding.get(position).getTitle());
            //item selected
            listViewSliding.setItemChecked(position, true);
            //Replace fragment
            replaceFragment(position);
            //Close menu
            drawerLayout.closeDrawer(listViewSliding);
        }
    });

    actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_opened, R.string.drawer_closed){

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            invalidateOptionsMenu();
        }
    };

    drawerLayout.setDrawerListener(actionBarDrawerToggle);
}


//Logout function
private void logout(){
    //Creating an alert dialog to confirm logout
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("Are you sure you want to logout?");
    alertDialogBuilder.setPositiveButton("Yes",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                    //Getting out sharedpreferences
                    SharedPreferences preferences = getSharedPreferences(Config.SHARED_PREF_NAME,Context.MODE_PRIVATE);
                    //Getting editor
                    SharedPreferences.Editor editor = preferences.edit();

                    //Puting the value false for loggedin
                    editor.putBoolean(Config.LOGGEDIN_SHARED_PREF, false);

                    //Putting blank value to email
                    editor.putString(Config.EMAIL_SHARED_PREF, "");

                    //Saving the sharedpreferences
                    editor.commit();

                    //Starting login activity
                    Intent intent = new Intent(ProfileActivity.this, LoginActivity.class);
                    startActivity(intent);
                }
            });

    alertDialogBuilder.setNegativeButton("No",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });

    //Showing the alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    /*button logout*/
    if(actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    /*button slide menu*/
    int id = item.getItemId();
    if (id == R.id.menuLogout) {
        //calling logout method when the logout button is clicked
        logout();
    }
    return super.onOptionsItemSelected(item);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    actionBarDrawerToggle.syncState();
}

//Create method replace fragment
private void replaceFragment(int pos) {
    Fragment fragment = null;
    switch (pos) {
        case 0:
            fragment = new Fragment1();
            break;
        case 1:
            fragment = new Fragment2();
            break;
        case 2:
            fragment = new Fragment3();
            break;
        default:
            fragment = new Fragment1();
            break;
    }

    if(null!=fragment) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction =          fragmentManager.beginTransaction();
        transaction.replace(R.id.main_content, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}



}

-Fragment1(地图片段):

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import me.eazypark.eazypark.R;

public class Fragment1 extends Fragment {
public Fragment1() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,     Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment1, container, false);
    return rootView;
}
}

-fragment1.xml(片段1布局):

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

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

</RelativeLayout>

-LocationFragment(地图类):

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;




public class LocationFragment extends Fragment {

private static View view;
/**
 * Note that this may be null if the Google Play services APK is not
 * available.
 */

private static GoogleMap mMap;
private static Double latitude, longitude;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (container == null) {
        return null;
    }
    view = (RelativeLayout) inflater.inflate(R.layout.fragment1, container, false);
    // Passing harcoded values for latitude & longitude. Please change as per your need. This is just used to drop a Marker on the Map
    latitude = 48.85;
    longitude = 2.35;

    setUpMapIfNeeded(); // For setting up the MapFragment

    return view;
}

/***** Sets up the map if it is possible to do so *****/
public static void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) ProfileActivity.fragmentManager
                .findFragmentById(R.id.location_map)).getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null)
            setUpMap();
    }
}

/**
 * This is where we can add markers or lines, add listeners or move the
 * camera.
 * <p>
 * This should only be called once and when we are sure that {@link #mMap}
 * is not null.
 */
private static void setUpMap() {
    // For showing a move to my loction button
    //mMap.setMyLocationEnabled(true);
    // For dropping a marker at a point on the Map
    mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My Home").snippet("Home Address"));
    // For zooming automatically to the Dropped PIN Location
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,
            longitude), 12.0f));
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    if (mMap != null)
        setUpMap();

    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) ProfileActivity.fragmentManager
                .findFragmentById(R.id.location_map)).getMap(); // getMap is deprecated
        // Check if we were successful in obtaining the map.
        if (mMap != null)
            setUpMap();
    }
}

/**** The mapfragment's id must be removed from the FragmentManager
 **** or else if the same it is passed on the next time then
 **** app will crash ****/
@Override
public void onDestroyView() {
    super.onDestroyView();
    if (mMap != null) {
        ProfileActivity.fragmentManager.beginTransaction()
                .remove(ProfileActivity.fragmentManager.findFragmentById(R.id.location_map)).commit();
        mMap = null;
    }
}
}

1 个答案:

答案 0 :(得分:2)

private GoogleMap googleMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            SetupActionBar();

            try {
                setContentView(R.layout.activity_near_by_deals_details);
                try {

                   context = this;
                   if (googleMap == null) {
                      googleMap = ((MapFragment) getFragmentManager()
                                 .findFragmentById(R.id.map)).getMap();
                   }
                   DrawPoint(pass param if needed);
        }


    public void DrawPoint(String param) {
            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            MarkerOptions marker = new MarkerOptions().position(new LatLng(LAT, LON)).title(name);
            marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
            googleMap.addMarker(marker);

            CameraPosition cameraPosition = new CameraPosition.Builder().target(
                    new LatLng(LAT, LON)).zoom(15).build();

            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
            googleMap.getUiSettings().setZoomControlsEnabled(true);
            googleMap.getUiSettings().setZoomGesturesEnabled(true);
        }

XML文件:

 <LinearLayout
            android:id="@+id/lnr_deal_detaisl_maps"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">


            <fragment
                android:id="@+id/map"
                android:name="com.google.android.gms.maps.MapFragment"
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:layout_marginTop="20dp"
                android:layout_weight="0.92" />


  </LinearLayout>

以上代码非常适合我。你检查了清单吗? Google API密钥有效吗?