Android应用程序正在破坏标签和谷歌地图
我使用的是ActionBar标签,有三个标签,第三个标签有谷歌地图。 当我在第1次和第3次之间切换时,它会崩溃,在第1次和第2次之间它也会崩溃,但在第2次和第3次切换之间从不崩溃。我不知道为什么会这样Android应用程序正在破坏标签和谷歌地图,android,google-maps,android-fragments,tabs,Android,Google Maps,Android Fragments,Tabs,我使用的是ActionBar标签,有三个标签,第三个标签有谷歌地图。 当我在第1次和第3次之间切换时,它会崩溃,在第1次和第2次之间它也会崩溃,但在第2次和第3次切换之间从不崩溃。我不知道为什么会这样 main活动的代码 package com.example.prototype; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.ActionBar.TabListener;
main活动的代码
package com.example.prototype;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.support.v4.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayout.DrawerListener;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
TabsPagerAdapter tabpager;
ViewPager pager;
DrawerLayout drawerLayout;
ActionBar action_bar;
ListView navigation_list;
@SuppressWarnings("deprecation")
ActionBarDrawerToggle drawerToggle;
String items[];
String tabs_list[]={"Best Offers","Categories","Near By Places"};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_layout);
initComponents();
action_bar=getActionBar();
setNavigationList();
setTabs();
}
@SuppressWarnings("deprecation")
private void setTabs() {
action_bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (String tab_name : tabs_list) {
action_bar.addTab(action_bar.newTab().setText(tab_name)
.setTabListener(this));
}
pager.setAdapter(tabpager);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
action_bar.setSelectedNavigationItem(arg0);;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
@SuppressWarnings("deprecation")
private void setNavigationList() {
int open=R.string.navigation_open;
int close=R.string.navigation_close;
navigation_list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
drawerToggle=new ActionBarDrawerToggle(this,drawerLayout, R.drawable.ic_menu_white_18dp,open,close){
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
action_bar.show();
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
action_bar.hide();
}
};
drawerLayout.setDrawerListener(drawerToggle);
action_bar.setDisplayHomeAsUpEnabled(true);
action_bar.setHomeButtonEnabled(true);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
private void initComponents() {
// TODO Auto-generated method stub
drawerLayout=(DrawerLayout) findViewById(R.id.drawer_layout);
action_bar=getActionBar();
navigation_list=(ListView) findViewById(R.id.left_drawer);
items=getResources().getStringArray(R.array.navigation_drawer);
pager=(ViewPager) findViewById(R.id.pager);
FragmentManager m=getSupportFragmentManager();
tabpager=new TabsPagerAdapter(m);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
if (id == R.id.search_menu) {
Toast.makeText(getApplicationContext(), "Searched Clicked ", Toast.LENGTH_LONG).show();
return true;
}
if (id == R.id.share_menu) {
Toast.makeText(getApplicationContext(), "Share Clicked ", Toast.LENGTH_LONG).show();
return true;
}
if (id == R.id.navigation_menu) {
Toast.makeText(getApplicationContext(), "Navigation Clicked ", Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
pager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
表2 java代码:
public class BestOfferFragment extends Fragment{
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.bestoffer, container, false);
}
}
public class CategoriesrFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.categories, container, false);
return rootView;
}
}
package com.example.prototype.tabs;
import java.util.Timer;
import com.example.prototype.MainActivity;
import com.example.prototype.R;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class NearByPlacesFragment extends Fragment implements OnMapReadyCallback, LocationListener {
static int i=0;
GoogleMap gmap;
Marker mp;
LatLng ll;
Location l;
Context ctx;
double lat,lon;
boolean isGpsEnabled,isNetworkAvailable,isLocationSet;
LocationManager lmgr;
long minTime = 1000;
long minDistance = 1;
Location loc;
SupportMapFragment mapFragment;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ctx=getActivity();
super.onCreateView(inflater, container, savedInstanceState);
if(mapFragment!=null){ Toast.makeText(getActivity(), "fragment exist`", 1000).show();}
View rootView = inflater.inflate(R.layout.nearbyplaces, container, false);
loc=getLocation();
if(gmap==null)
setMap();
Toast.makeText(getActivity(), "created`", 1000).show();
return rootView;
}
private void setMap() {
// TODO Auto-generated method stub
mapFragment = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
private void setMarker() {
// TODO Auto-generated method stub
if(gmap!=null){
lat=loc.getLatitude();
lon=loc.getLongitude();
ll=new LatLng(lat, lon);
Toast.makeText(getActivity(), "lat"+lat, Toast.LENGTH_LONG).show();
mp=gmap.addMarker(new MarkerOptions().position(ll).title("Your Location"));
CameraUpdate center=CameraUpdateFactory.newLatLng(new LatLng(lat,lon));
CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
gmap.moveCamera(center);
gmap.animateCamera(zoom);
}
}
@Override
public void onMapReady(GoogleMap map) {
// TODO Auto-generated method stub
map.getUiSettings().setAllGesturesEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.setMyLocationEnabled(true);
gmap=map;
setMarker();
}
public Location getLocation(){
lmgr=(LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled=lmgr.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkAvailable=lmgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(isGpsEnabled==true){
setLocationManager("gps");
}
else if(isNetworkAvailable==true){
setLocationManager("network");
}
return loc;
}
private boolean setLocationManager(String s){
if(s.equals("gps")){
Toast.makeText(getActivity(), "gps", Toast.LENGTH_LONG).show();
lmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, this);
loc=lmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
else{
lmgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, this);
loc=lmgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
return isLocationSet;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
表3 java代码:
public class BestOfferFragment extends Fragment{
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.bestoffer, container, false);
}
}
public class CategoriesrFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.categories, container, false);
return rootView;
}
}
package com.example.prototype.tabs;
import java.util.Timer;
import com.example.prototype.MainActivity;
import com.example.prototype.R;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class NearByPlacesFragment extends Fragment implements OnMapReadyCallback, LocationListener {
static int i=0;
GoogleMap gmap;
Marker mp;
LatLng ll;
Location l;
Context ctx;
double lat,lon;
boolean isGpsEnabled,isNetworkAvailable,isLocationSet;
LocationManager lmgr;
long minTime = 1000;
long minDistance = 1;
Location loc;
SupportMapFragment mapFragment;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ctx=getActivity();
super.onCreateView(inflater, container, savedInstanceState);
if(mapFragment!=null){ Toast.makeText(getActivity(), "fragment exist`", 1000).show();}
View rootView = inflater.inflate(R.layout.nearbyplaces, container, false);
loc=getLocation();
if(gmap==null)
setMap();
Toast.makeText(getActivity(), "created`", 1000).show();
return rootView;
}
private void setMap() {
// TODO Auto-generated method stub
mapFragment = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
private void setMarker() {
// TODO Auto-generated method stub
if(gmap!=null){
lat=loc.getLatitude();
lon=loc.getLongitude();
ll=new LatLng(lat, lon);
Toast.makeText(getActivity(), "lat"+lat, Toast.LENGTH_LONG).show();
mp=gmap.addMarker(new MarkerOptions().position(ll).title("Your Location"));
CameraUpdate center=CameraUpdateFactory.newLatLng(new LatLng(lat,lon));
CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
gmap.moveCamera(center);
gmap.animateCamera(zoom);
}
}
@Override
public void onMapReady(GoogleMap map) {
// TODO Auto-generated method stub
map.getUiSettings().setAllGesturesEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.setMyLocationEnabled(true);
gmap=map;
setMarker();
}
public Location getLocation(){
lmgr=(LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled=lmgr.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkAvailable=lmgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(isGpsEnabled==true){
setLocationManager("gps");
}
else if(isNetworkAvailable==true){
setLocationManager("network");
}
return loc;
}
private boolean setLocationManager(String s){
if(s.equals("gps")){
Toast.makeText(getActivity(), "gps", Toast.LENGTH_LONG).show();
lmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, this);
loc=lmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
else{
lmgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, this);
loc=lmgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
return isLocationSet;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
表3 xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/nearbyplace"
xmlns:android="http://schemas.android.com/apk/res/android">
<fragment android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment" />
</RelativeLayout>
以下是日志:
07-11 01:49:28.877:E/NativeCrypto(7463):ssl=0x616b4438证书验证回调x509存储ctx=0x6210aab0 arg=0x0
07-11 01:49:28.882:E/NativeCrypto(7463):ssl=0x616b4438证书验证回调调用verifyCertificateChain authMethod=ECDHE\U ECDSA
07-11 01:49:35.046:E/AndroidRuntime(7463):致命异常:主
07-11 01:49:35.046:E/AndroidRuntime(7463):android.view.InflateException:二进制XML文件行#8:膨胀类片段时出错
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-11 01:49:35.046:E/AndroidRuntime(7463):位于com.example.prototype.tabs.NearByPlacesFragment.onCreateView(NearByPlacesFragment.java:58)
07-11 01:49:35.046:E/AndroidRuntime(7463):位于android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1314)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:730)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.view.ViewPager.populate(ViewPager.java:951)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.view.ViewPager$3.run(ViewPager.java:250)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.Choreographer.doCallbacks(Choreographer.java:579)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.Choreographer.doFrame(Choreographer.java:547)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.os.Handler.handleCallback(Handler.java:725)上
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.os.Handler.dispatchMessage(Handler.java:92)上
07-11 01:49:35.046:E/AndroidRuntime(7463):位于android.os.Looper.loop(Looper.java:153)
07-11 01:49:35.046:E/AndroidRuntime(7463):位于android.app.ActivityThread.main(ActivityThread.java:5297)
07-11 01:49:35.046:E/AndroidRuntime(7463):位于java.lang.reflect.Method.Invokenactive(本机方法)
07-11 01:49:35.046:E/AndroidRuntime(7463):位于java.lang.reflect.Method.invoke(Method.java:511)
07-11 01:49:35.046:E/AndroidRuntime(7463):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-11 01:49:35.046:E/AndroidRuntime(7463):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-11 01:49:35.046:E/AndroidRuntime(7463):在dalvik.system.NativeStart.main(本机方法)
07-11 01:49:35.046:E/AndroidRuntime(7463):由以下原因引起:java.lang.IllegalArgumentException:二进制XML文件行#8:重复id 0x7f08006c、标记null或父id 0x7f08006b,以及com.google.android.gms.maps.SupportMapFragment的另一个片段
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2175)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater$FactoryMerge.onCreateView(LayoutInflater.java:168)
07-11 01:49:35.046:E/AndroidRuntime(7463):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
2007-11 01:49:35.046:E/AndroidRuntime(7463):。。。还有27个
运行时异常的原因:当启动应用程序时,它会初始化所有选项卡,然后再次滑动到选项卡3,即映射选项卡,代码试图创建另一个尚未销毁的映射片段,这会导致非法状态异常,有两种解决方案:
解决方案1:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ctx=getActivity();
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.nearbyplaces, container, false);
} catch (InflateException e) {
}
//rest of code is same
}
在本文中,我们首先替换现有片段,从父级中删除它,然后再次添加
解决方案2:这是最好的解决方案:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ctx=getActivity();
if (view == null) {
view = inflater.inflate(R.layout.nearbyplaces, container, false);
}
//rest of code is same
return view;
}
确保不会遇到此错误的最佳方法是使片段扩展SupportMapFragment
,而不是在片段中嵌套一个片段
我刚刚使用了一个ViewPager
和一个FragmentPagerAdapter
并将地图作为一个选项卡来完成这项工作
以下是一般结构,注意不需要重写onCreateView()
方法,也不需要膨胀任何布局xml:
public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback {
private GoogleMap mMap;
private Marker marker;
public MyMapFragment() {
}
@Override
public void onResume() {
super.onResume();
Log.d("MyMap", "onResume");
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
if (mMap == null) {
Log.d("MyMap", "setUpMapIfNeeded");
getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.d("MyMap", "onMapReady");
mMap = googleMap;
setUpMap();
}
private void setUpMap() {
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings().setMapToolbarEnabled(false);
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
Log.d("MyMap", "MapClick");
//remove previously placed Marker
if (marker != null) {
marker.remove();
}
//place marker where user just clicked
marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
Log.d("MyMap", "MapClick After Add Marker");
}
});
}
}
结果:
I ha