我有导航抽屉的主要活动,用 2 个不同的片段替换框架布局:
1 带有谷歌地图 2 带有 gps 的详细信息
我有 2 个问题:(第一个已解决)
1-当我有位置(gps 固定)时,如果我改变设备的方向我失去了修复......我希望屏幕旋转改变时没有任何改变。谢谢(已解决)
2-当我从片段 1 传递到其他片段时,将重新创建片段,我希望重新调用之前的状态.... 示例:如果我从地图传递到 gps 的详细信息,则文本视图必须重新充电,并且有 1 秒没有文本....我希望 textview 是即时的,而不需要重新创建片段谢谢
对不起我的英语不好...
public class MainActivity extends SherlockFragmentActivity implements LocationListener, GpsStatus.Listener {
private static final String TAG = "FixGpsActivity";
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mActivityTitles;
private ListView mDrawerList;
private SherlockActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private boolean isShared= false;
private LocationManager mService;
private LocationProvider mProvider;
private GpsStatus mStatus;
private ArrayList<FixGpsListener> mFixGpsListeners = new ArrayList<FixGpsListener>();
boolean mStarted;
private Location mLastLocation;
ShareActionProvider providerShare;
Fragment mapFragment= new MapFragment();
Fragment gpsFragment= new GpsDatiFragment();
Fragment altroFragment= new AltroFragment();
private static MainActivity sInstance;
interface FixGpsListener extends LocationListener {
public void gpsStart();
public void gpsStop();
public void onGpsStatusChanged(int event, GpsStatus status);
}
static MainActivity getInstance() {
return sInstance;
}
void addSubActivity(FixGpsListener activity) {
mFixGpsListeners.add(activity);
}
private void gpsStart() {
if (!mStarted) {
mService.requestLocationUpdates(mProvider.getName(), 1000, 0.0f, this);
mStarted = true;
}
for (FixGpsListener activity : mFixGpsListeners) {
activity.gpsStart();
}
}
private void gpsStop() {
if (mStarted) {
mService.removeUpdates(this);
mStarted = false;
}
for (FixGpsListener activity : mFixGpsListeners) {
activity.gpsStop();
}
}
private boolean sendExtraCommand(String command) {
return mService.sendExtraCommand(LocationManager.GPS_PROVIDER, command, null);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sInstance = this;
mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mProvider = mService.getProvider(LocationManager.GPS_PROVIDER);
if (mProvider == null) {
// FIXME - fail gracefully here
Log.e(TAG, "Unable to get GPS_PROVIDER");
}
mService.addGpsStatusListener(this);
// Request use of spinner for showing indeterminate progress, to show
// the user something is going on during long-running operations
//requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.drawer_layout);
// Hide the indeterminate progress bar on the activity until we need it
//setSupportProgressBarIndeterminateVisibility(Boolean.FALSE);
mTitle = mDrawerTitle = getTitle();
mActivityTitles = getResources().getStringArray(R.array.Activity);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mActivityTitles));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new SherlockActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(0);
}
}
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
if (mLastLocation !=null) {
providerShare = (ShareActionProvider) menu.findItem(R.id.action_share).getActionProvider();
//providerShare.setShareHistoryFileName(ActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
providerShare.setShareIntent(createShareIntent());
}
return true;
}
private Intent createShareIntent() {
Intent mShareIntent = new Intent(Intent.ACTION_SEND);
mShareIntent.setType("text/plain");
if (mLastLocation !=null) {
// TODO Auto-generated method stub
String locationString = "http://maps.google.com/maps?geocode=&q=" +
Double.toString(mLastLocation.getLatitude()) + "," +
Double.toString(mLastLocation.getLongitude());
mShareIntent.putExtra(Intent.EXTRA_SUBJECT, "My Location");
mShareIntent.putExtra(Intent.EXTRA_TEXT, locationString );
}else {
}
return mShareIntent;
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu (com.actionbarsherlock.view.Menu menu) {
// Get the ActionProvider
// ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.action_share)
// .getActionProvider();
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_share).setEnabled(!drawerOpen);
MenuItem item= menu.findItem(R.id.gps_start);
if(!mStarted){
item.setIcon(R.drawable.ic_gps_start_green);
}else{
item.setIcon(R.drawable.ic_gps_stop_red);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch(item.getItemId()) {
case R.id.action_share:
return true;
case R.id.gps_start:
if(mStarted){
gpsStop();
item.setIcon(R.drawable.ic_gps_start_green);
}else{
gpsStart();
item.setIcon(R.drawable.ic_gps_stop_red);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
private void selectItem(int position) {
// Getting reference to the FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
switch (position) {
case 0:
mapFragment.setRetainInstance(true);
ft.replace(R.id.content_frame, mapFragment);
//ft.commit();
break;
case 1:
gpsFragment.setRetainInstance(true);
ft.replace(R.id.content_frame,gpsFragment);
//ft.commit();
break;
case 2:
ft.replace(R.id.content_frame, altroFragment);
//ft.commit();
break;
case 3:
finish();
default:
break;
}
ft.commit();
mDrawerList.setItemChecked(position, true);
// Close drawer
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
protected void onDestroy() {
mService.removeGpsStatusListener(this);
mService.removeUpdates(this);
super.onDestroy();
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
mLastLocation = location;
if (!isShared) {
invalidateOptionsMenu();
isShared=true;
}
for (FixGpsListener activity : mFixGpsListeners) {
activity.onLocationChanged(location);
}
}
public void onStatusChanged(String provider, int status, Bundle extras) {
for (FixGpsListener activity : mFixGpsListeners) {
activity.onStatusChanged(provider, status, extras);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
for (FixGpsListener activity : mFixGpsListeners) {
activity.onProviderDisabled(provider);
}
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
for (FixGpsListener activity : mFixGpsListeners) {
activity.onProviderEnabled(provider);
}
}
@Override
public void onGpsStatusChanged(int event) {
mStatus = mService.getGpsStatus(mStatus);
for (FixGpsListener activity : mFixGpsListeners) {
activity.onGpsStatusChanged(event, mStatus);
}
}
@Override
protected void onResume() {
super.onResume();
/*
if (mStarted){
mService.requestLocationUpdates(mProvider.getName(), 1000, 0.0f, this);
}*/
}
@Override
protected void onRestoreInstanceState(Bundle outState) {
super.onRestoreInstanceState(outState);
// Read values from the "savedInstanceState"-object and put them in your textview
mStarted= outState.getBoolean("ciao");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// Save the values you need from your textview into "outState"-object
super.onSaveInstanceState(outState);
outState.putBoolean("ciao", mStarted);
}
映射片段:
public class MapFragment extends SherlockMapFragment implements MainActivity.FixGpsListener, View.OnClickListener, LocationSource{
private GoogleMap mMap;
private OnLocationChangedListener mListener; //Used to update the map with new location
// Constants used to control how the camera animates to a position
public static final float CAMERA_INITIAL_ZOOM = 18.0f;
public static final float CAMERA_INITIAL_BEARING = 0.0f;
public static final float CAMERA_INITIAL_TILT = 45.0f;
private boolean mGotFix;
CameraPosition cp;
double latitude;
double longitude;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//
View v =super.onCreateView(inflater, container, savedInstanceState);
mMap = getMap();
if(isGoogleMapsInstalled()) {
if (mMap != null) {
//Show the location on the map
mMap.setMyLocationEnabled(true);
//Set location source
mMap.setLocationSource(this);
MainActivity.getInstance().addSubActivity(this);
}
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getString(R.string.please_install_google_maps));
builder.setCancelable(false);
builder.setPositiveButton(getString(R.string.install), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps"));
startActivity(intent);
getActivity().finish();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
return v;
}
@Override
public void onPause(){
super.onPause();
cp = mMap.getCameraPosition();
}
@Override
public void onResume() {
//setUpCamera();
if (cp != null) {
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cp));
cp = null;
}
//SharedPreferences settings = Application.getPrefs();
//if(mMap != null){
//mMap.setMapType(Integer.valueOf (String.valueOf(GoogleMap.MAP_TYPE_NORMAL)));
//}
super.onResume();
}
public void onClick(View v) {}
public void gpsStart() {
mGotFix = false;
}
public void gpsStop() {
}
public void onLocationChanged(Location loc) {
//Update real-time location on map
if (mListener != null) {
mListener.onLocationChanged(loc);
}
latitude= loc.getLatitude();
longitude= loc.getLongitude();
setUpCamera();
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
public void onGpsStatusChanged(int event, GpsStatus status) {}
/**
* Maps V2 Location updates
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
}
/**
* Maps V2 Location updates
*/
@Override
public void deactivate() {
mListener = null;
}
/**
* Returns true if Google Maps is installed, false if it is not
* @return
*/
@SuppressWarnings("unused")
public boolean isGoogleMapsInstalled() {
try {
ApplicationInfo info = getActivity().getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0 );
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
public void setUpCamera(){
if (mMap != null) {
//Get bounds for detection of real-time location within bounds
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
if (!mGotFix &&
(!bounds.contains(new LatLng(latitude, longitude)) ||
mMap.getCameraPosition().zoom < (mMap.getMaxZoomLevel() / 2))) {
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude, longitude))
.zoom(CAMERA_INITIAL_ZOOM)
.bearing(CAMERA_INITIAL_BEARING)
.tilt(CAMERA_INITIAL_TILT)
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
mGotFix = true;
}
}
}
详情_GPS
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
mRes = getResources();
View rootView = inflater.inflate(R.layout.activity_main, container, false);
mLatitudeView= (TextView) rootView.findViewById(R.id.textView2);
mLongitudeView= (TextView) rootView.findViewById(R.id.textView4);
mAltitudeView= (TextView) rootView.findViewById(R.id.textView6);
mAccuracyView= (TextView) rootView.findViewById(R.id.textView8);
mSpeedView= (TextView) rootView.findViewById(R.id.textView10);
mFixTimeView= (TextView) rootView.findViewById(R.id.textView12);
mTTFFView= (TextView) rootView.findViewById(R.id.TTFF);
satFixed= (TextView) rootView.findViewById(R.id.textView14);
mBearingView= (TextView) rootView.findViewById(R.id.bearing);
GridView gridView = (GridView)rootView.findViewById(R.id.sv_grid);
mAdapter = new SvGridAdapter(getActivity());
gridView.setAdapter(mAdapter);
gridView.setFocusable(false);
gridView.setFocusableInTouchMode(false);
MainActivity.getInstance().addSubActivity(this);
return rootView;
}
private void setStarted(boolean navigating) {
if (navigating != mNavigating) {
if (navigating) {
} else {
mLatitudeView.setText(EMPTY_LAT_LONG);
mLongitudeView.setText(EMPTY_LAT_LONG);
mFixTime = 0;
updateFixTime();
mTTFFView.setText("");
mAltitudeView.setText("");
mAccuracyView.setText("");
mSpeedView.setText("");
mBearingView.setText("");
mSvCount = 0;
mAdapter.notifyDataSetChanged();
}
mNavigating = navigating;
}
}
private void updateFixTime() {
if (mFixTime == 0 || !MainActivity.getInstance().mStarted) {
mFixTimeView.setText("");
} else {
mFixTimeView.setText(DateUtils.getRelativeTimeSpanString(
mFixTime, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS));
}
}
@Override
public void onResume() {
MainActivity gta = MainActivity.getInstance();
setStarted(gta.mStarted);
super.onResume();
}
public void onGpsStarted() {
setStarted(true);
}
public void onGpsStopped() {
setStarted(false);
}
@SuppressLint("NewApi")
public void gpsStart() {
//Reset flag for detecting first fix, and capture GPS start time for calculating TTFF later
mGotFix = false;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
//According to Android docs, elapsedRealtimeNanos() is preferred for elapsed time measurements
mGpsStartTime = SystemClock.elapsedRealtimeNanos();
} else {
mGpsStartTime = System.currentTimeMillis();
}
}
public void gpsStop() {
}
public void onGpsStatusChanged(int event, GpsStatus status) {
switch (event) {
case GpsStatus.GPS_EVENT_STARTED:
setStarted(true);
break;
case GpsStatus.GPS_EVENT_STOPPED:
setStarted(false);
satFixed.setText("0/0");
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
//status.getTimeToFirstFix() doesn't return a reliable value (see Issue #3),
//so we're manually calculating TTFF instead in onLocationChanged()
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
updateStatus(status);
Iterable<GpsSatellite> listSat = status.getSatellites();
nSatFixed = 0;
totSat=0;
Iterator<GpsSatellite> sat= listSat.iterator();
for (GpsSatellite satellite : listSat) {
totSat++;
if (satellite.usedInFix()) {
nSatFixed++;
}
}
satFixed.setText((nSatFixed)+"/"+(totSat));
break;
}
}
@Override
public void onLocationChanged(Location location) {
if (!mGotFix) {
updateTtff(location);
mGotFix = true;
}
mLatitudeView.setText(doubleToString(location.getLatitude(), 7) + " ");
mLongitudeView.setText(doubleToString(location.getLongitude(), 7) + " ");
mFixTime = location.getTime();
if (location.hasAltitude()) {
mAltitudeView.setText(doubleToString(location.getAltitude(), 1) + " m");
} else {
mAltitudeView.setText("");
}
if (location.hasAccuracy()) {
mAccuracyView.setText(doubleToString(location.getAccuracy(), 1) + " m");
} else {
mAccuracyView.setText("");
}
if (location.hasSpeed()) {
mSpeedView.setText(doubleToString(location.getSpeed(), 1) + " m/sec");
} else {
mSpeedView.setText("");
}
if (location.hasBearing()) {
mBearingView.setText(doubleToString(location.getBearing(), 1) + " deg");
} else {
mBearingView.setText("");
}
updateFixTime();
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
private static String doubleToString(double value, int decimals) {
String result = Double.toString(value);
// truncate to specified number of decimal places
int dot = result.indexOf('.');
if (dot > 0) {
int end = dot + decimals + 1;
if (end < result.length()) {
result = result.substring(0, end);
}
}
return result;
}
private void updateStatus(GpsStatus status) {
setStarted(true);
// update the fix time regularly, since it is displaying relative time
updateFixTime();
Iterator<GpsSatellite> satellites = status.getSatellites().iterator();
if (mPrns == null) {
int length = status.getMaxSatellites();
mPrns = new int[length];
mSnrs = new float[length];
mSvElevations = new float[length];
mSvAzimuths = new float[length];
}
mSvCount = 0;
mEphemerisMask = 0;
mAlmanacMask = 0;
mUsedInFixMask = 0;
while (satellites.hasNext()) {
GpsSatellite satellite = satellites.next();
int prn = satellite.getPrn();
int prnBit = (1 << (prn - 1));
mPrns[mSvCount] = prn;
mSnrs[mSvCount] = satellite.getSnr();
mSvElevations[mSvCount] = satellite.getElevation();
mSvAzimuths[mSvCount] = satellite.getAzimuth();
if (satellite.hasEphemeris()) {
mEphemerisMask |= prnBit;
}
if (satellite.hasAlmanac()) {
mAlmanacMask |= prnBit;
}
if (satellite.usedInFix()) {
mUsedInFixMask |= prnBit;
}
mSvCount++;
//satFixed.setText(mSvCount);
}
mAdapter.notifyDataSetChanged();
}
@SuppressLint("NewApi")
private void updateTtff(Location location){
long ttff;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
//According to Android docs, elapsedRealtimeNanos() is preferred for elapsed time measurements
ttff = location.getElapsedRealtimeNanos() - mGpsStartTime; //TTFF in nanoseconds
ttff = (ttff + 500000000) / 1000000000;
} else {
ttff = location.getTime() - mGpsStartTime; //TTFF in milliseconds
ttff = (ttff + 500) / 1000;
}
mTTFFView.setText(Long.toString(ttff) + " sec");
}
private class SvGridAdapter extends BaseAdapter {
public SvGridAdapter(Context c) {
mContext = c;
}
public int getCount() {
// add 1 for header row
return (mSvCount + 1) * COLUMN_COUNT;
}
public Object getItem(int position) {
Log.d(TAG, "getItem(" + position + ")");
return "foo";
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView;
if (convertView == null) {
textView = new TextView(mContext);
} else {
textView = (TextView) convertView;
}
int row = position / COLUMN_COUNT;
int column = position % COLUMN_COUNT;
CharSequence text = null;
if (row == 0) {
switch (column) {
case PRN_COLUMN:
text = mRes.getString(R.string.gps_prn_column_label);
break;
case SNR_COLUMN:
text = mRes.getString(R.string.gps_snr_column_label);
break;
case ELEVATION_COLUMN:
text = mRes.getString(R.string.gps_elevation_column_label);
break;
case AZIMUTH_COLUMN:
text = mRes.getString(R.string.gps_azimuth_column_label);
break;
case FLAGS_COLUMN:
text = mRes.getString(R.string.gps_flags_column_label);
break;
}
} else {
row--;
switch (column) {
case PRN_COLUMN:
text = Integer.toString(mPrns[row]);
break;
case SNR_COLUMN:
text = Float.toString(mSnrs[row]);
break;
case ELEVATION_COLUMN:
text = Float.toString(mSvElevations[row]);
break;
case AZIMUTH_COLUMN:
text = Float.toString(mSvAzimuths[row]);
break;
case FLAGS_COLUMN:
char[] flags = new char[3];
flags[0] = ((mEphemerisMask & (1 << (mPrns[row] - 1))) == 0 ? ' ' : 'E');
flags[1] = ((mAlmanacMask & (1 << (mPrns[row] - 1))) == 0 ? ' ' : 'A');
flags[2] = ((mUsedInFixMask & (1 << (mPrns[row] - 1))) == 0 ? ' ' : 'U');
text = new String(flags);
break;
}
}
textView.setText(text);
return textView;
}
private Context mContext;
}