2016-09-05 3 views
-1

Название может быть немного сложным, но проблема буквально описана. Я пытаюсь использовать фрагмент карты Google в стеке фрагментов. Когда приложение запустится, пользователь увидит кнопку, и когда пользователь нажимает кнопку, текущий вид будет заменен фрагментом карты. В настоящее время я могу заменить фрагменты, но когда отображается фрагмент карты, в представлении по-прежнему есть кнопка предыдущего фрагмента. Также я пытаюсь заменить фрагменты на одной из вкладок моего приложения. Вот мой код;Фрагмент Google Map показывает элемент предыдущего фрагмента

Карта Фрагмент;

public class MapFragment extends Fragment { 

    MapView mMapView; 
    private GoogleMap googleMap; 

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

     mMapView = (MapView) rootView.findViewById(R.id.mapView); 
     mMapView.onCreate(savedInstanceState); 

     mMapView.onResume(); // needed to get the map to display immediately 

     try { 
      MapsInitializer.initialize(getActivity().getApplicationContext()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mMapView.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap mMap) { 
       googleMap = mMap; 
       try { 
        googleMap.setMyLocationEnabled(true); 
       } catch (SecurityException e) { 
        e.printStackTrace(); 
       } 
       // For dropping a marker at a point on the Map 
       LatLng sydney = new LatLng(-34, 151); 
       googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker Title").snippet("Marker Description")); 

       // For zooming automatically to the location of the marker 
       CameraPosition cameraPosition = new CameraPosition.Builder().target(sydney).zoom(12).build(); 
       googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
      } 
     }); 

     return rootView; 
    } 

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

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

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

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

Главная Фрагмент;

public class HomeFragment extends RootFragment { 

    public HomeFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     // Obtain the shared Tracker instance. 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.home_tab, container, false); 

     Button go = (Button)v.findViewById(R.id.btn_go); 
     go.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Intent intent = new Intent(getActivity(), MapFragment.class); 
       //startActivity(intent); 
       enterNextFragment(); 
      } 
     }); 
     return v; 
    } 

    @Override 
    public void onResume() { 

     super.onResume(); 
    } 
    private void enterNextFragment() { 
     // Pushing MapView Fragment 
     Fragment fragment = Fragment.instantiate(this.getContext(), MapFragment.class.getName()); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_mainLayout, fragment); 
     ft.commit(); 
    } 

} 

Map Layout;

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

    <com.google.android.gms.maps.MapView 
     android:id="@+id/mapView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout> 

Главная Фрагмент;

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".HomeFragment" 
android:background="@android:color/white" 
android:id="@+id/fragment_mainLayout"> 

<!-- TODO: Update blank fragment layout --> 


<android.support.v7.widget.AppCompatButton 
    android:id="@+id/btn_go" 
    android:layout_width="fill_parent" 
    android:layout_marginRight="20dp" 
    android:layout_marginLeft="20dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="170dp" 
    android:text="GO"/> 

</FrameLayout> 
+0

Вы проверили мой ответ? – ziLk

+0

Я решил случай, не используя карту как фрагмент. Я создал другое представление и назвал его активным. Когда пользователь нажимает кнопку «Пуск», он запускает другое действие, не заменяя текущее представление. –

ответ

0

Часто вы хотите один фрагмент общаться с другой, например, чтобы изменить содержание, основанное на события пользователя. Все Связь фрагментов с фрагментами осуществляется через связанную с ней деятельность . Два фрагмента никогда не должны связываться напрямую.

Ваши фрагменты не должны связываться непосредственно в соответствии с the documentation.

Если вам удалось связаться с вашими фрагментами с учетом документации. Затем вы можете использовать этот простой метод, чтобы иметь возможность изменять и повторно использовать любой фрагмент.

В хост-активности:

private void changeFragment(Fragment frag, boolean saveInBackstack) { 
    String backStateName = ((Object) frag).getClass().getName(); 

    try { 
     FragmentManager manager = getSupportFragmentManager(); 

     if (manager.findFragmentByTag(backStateName) == null) { 
      //fragment not in back stack, create it. 
      FragmentTransaction transaction = manager.beginTransaction(); 
      transaction.replace(R.id.container, frag, backStateName); 

      if (saveInBackstack) { 
       Log.d(TAG, "Change Fragment: addToBackTack " + backStateName); 
       transaction.addToBackStack(backStateName); 
      } else { 
       Log.d(TAG, "Change Fragment: NO addToBackTack"); 
      } 

      transaction.commit(); 
     } else { 
      manager.popBackStack(); 
     } 
    } catch (IllegalStateException exception) { 
     Log.w(TAG, "Unable to commit fragment, could be activity as been killed in 
    } 
} 
+0

Это не тот ответ, который я искал, и не решил моего дела. –

0

просто добавить android:background="@android:color/white" на главном окне map_layout xml файла

0

Вот решение;

Главная Фрагмент;

public class HomeFragment extends RootFragment { 
    private LocationManager locationManager; 

    public HomeFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     // Obtain the shared Tracker instance. 
     locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.home_tab, container, false); 
     Button go = (Button) v.findViewById(R.id.btn_go); 
     go.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), MapFragment.class); 
       if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
        //Toast.makeText(getContext(), "GPS is Enabled in your devide", Toast.LENGTH_SHORT).show(); 
        startActivity(intent); 
       } 
      } 
     }); 
     return v; 
    } 

    @Override 
    public void onResume() { 

     super.onResume(); 
    } 
} 

MapFragment (теперь это фрагментАктивность, а не фрагмент);

public class MapFragment extends FragmentActivity implements OnMapReadyCallback, 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, 
     LocationListener { 

    MapView mMapView; 
    private GoogleMap googleMap; 
    // private GoogleMap map; 
    private LocationRequest mLocationRequest; 
    private GoogleApiClient mGoogleApiClient; 
    private Location mLastLocation; 
    private Marker marker; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     mMapView = (MapView) findViewById(R.id.mapView); 
     mMapView.onCreate(savedInstanceState); 

     mMapView.onResume(); // needed to get the map to display immediately 

     try { 
      MapsInitializer.initialize(this.getApplicationContext()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mMapView.getMapAsync(this); 



    } 

    @Override 
    public void onMapReady(GoogleMap mMap) { 
     googleMap = mMap; 
     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     Location location = null; 
     try { 
      googleMap.setMyLocationEnabled(true); 
      location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false)); 

     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 


     if (location != null) { 
      googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 13)); 

      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(new LatLng(location.getLatitude(), location.getLongitude()))  // Sets the center of the map to location user 
        .zoom(17)     // Sets the zoom 
        .bearing(90)    // Sets the orientation of the camera to east 
        .tilt(40)     // Sets the tilt of the camera to 30 degrees 
        .build();     // Creates a CameraPosition from the builder 
      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
     } 
    } 
} 
Смежные вопросы