Google Map片段显示了上一个片段的元素

时间:2016-09-05 22:14:05

标签: android google-maps android-fragments

标题可能有点复杂,但问题实际上就像所描述的那样。我试图在片段堆栈中使用谷歌地图片段。当应用程序启动时,用户将看到一个按钮,当用户按下按钮时,当前视图将被替换为地图片段。目前,我能够替换片段,但是当显示地图片段时,视图仍然具有前一片段的按钮。我也试图替换我的应用程序的一个选项卡中的片段。这是我的代码;

地图片段;

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();
    }
}

Home Fragment;

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();
    }

}

地图布局;

<?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>

Home Fragment;

<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>

3 个答案:

答案 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
    }
}

答案 1 :(得分:0)

只需在map_layout xml文件的主视图中添加 import java.util.Scanner; public class ScannerDemo { public static void main (String [] args) { Scanner sc = new Scanner(System.in); String userName; System.out.println("Enter a number"); int userName = sc.nextInt(); System.out.println("your number is " + userName); System.out.println("enter your next number"); int userName2 = sc.nextInt(); System.out.println("your total is " + (userName2 + userName)); } }

答案 2 :(得分:0)

这是解决方案;

Home Fragment;

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(现在是fragmentActivity而不是片段);

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));
        }
    }
}