抽屉导航后,地图既不可缩放也不可移动

时间:2019-07-17 20:32:29

标签: android google-maps

将Google地图添加到抽屉式导航中后,该地图既不可缩放也不可移动。我知道,对此有一些疑问,我将抽屉式导航作为可单击菜单使用,可通过底部导航栏调用它,这使我的情况略有不同。因此,我需要MapsActivity类中的抽屉式导航。

我的代码- MapsActivity

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback,
        NavigationView.OnNavigationItemSelectedListener {

    private GoogleMap mMap;
    public Toolbar toolbar;
    public DrawerLayout drawerLayout;
    public NavController navController;
    public NavigationView accountNavigationView, settingsNavigationView;
    private SeekBar distanceSeekbar;
    private TextView distanceText;

    private FusedLocationProviderClient fusedLocationProviderClient;

    private static int radius;
    static List<Circle> mCircleList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        drawerLayout = findViewById(R.id.drawer_layout);

        // disable slide on drawer navigation
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_account:
                        Toast.makeText(MapsActivity.this, "Profile", Toast.LENGTH_SHORT).show();
                        drawerLayout.openDrawer(Gravity.LEFT);
                        if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                            drawerLayout.closeDrawer(Gravity.RIGHT);
                        }
                        break;
                    case R.id.action_map:
                        Toast.makeText(MapsActivity.this, "Map", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(MapsActivity.this, MapsActivity.class));
                        break;
                    case R.id.action_settings:
                        Toast.makeText(MapsActivity.this, "Settings", Toast.LENGTH_SHORT).show();
                        drawerLayout.openDrawer(Gravity.RIGHT);
                        if (drawerLayout.isDrawerOpen(Gravity.LEFT)) {
                            drawerLayout.closeDrawer(Gravity.LEFT);
                        }
                        break;
                }

                return true;
            }
        });


        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        setupNavigation();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fusedLocationProviderClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    if (location != null) {
                        final LatLng current_location = new LatLng(location.getLatitude(), location.getLongitude());
                        mMap.addMarker(new MarkerOptions().position(current_location).title("Current location"));
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));
                        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(current_location, 14));

                        // set radius on user's settings
                        distanceSeekbar = (SeekBar) findViewById(R.id.distance_seekbar);
                        distanceSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

                            @Override
                            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                                // set progress as text
                                distanceText = (TextView) findViewById(R.id.distance_text);
                                distanceText.setText("Distance: " + progress);

                                if (mCircleList == null) {
                                    mCircleList = new ArrayList<Circle>();
                                } else if (mCircleList.size() >= 1) {
                                    deleteCircles();
                                }
                                radius = progress;
                                setCircle(current_location, radius);

                            }

                            @Override
                            public void onStartTrackingTouch(SeekBar seekBar) {

                            }

                            @Override
                            public void onStopTrackingTouch(SeekBar seekBar) {

                            }
                        });
                    }
                }
            });
        }

        mMap.setOnCircleClickListener(new GoogleMap.OnCircleClickListener() {
            @Override
            public void onCircleClick(Circle circle) {
                int strokeColor = circle.getStrokeColor() ^ 0x00ffffff;
                circle.setFillColor(strokeColor);
            }
        });
    }

    // set circle
    private void setCircle(LatLng currentLocation, int radius) {
        CircleOptions circleOptions = new CircleOptions()
                .center(currentLocation)
                .radius(radius)
                .strokeWidth(2)
                .strokeColor(Color.GREEN)
                .fillColor(Color.argb(128, 255, 0, 0))
                .clickable(true);
        Circle circle = mMap.addCircle(circleOptions);
        mCircleList.add(circle);
    }

    public void deleteCircles() {

        for (int i = 0; i <= mCircleList.size() - 1; i++) {
            Circle mCircle = mCircleList.get(i);
            mCircle.remove();
        }
        mCircleList.clear();
    }


    private void setupNavigation() {
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        drawerLayout = findViewById(R.id.drawer_layout);
        accountNavigationView = findViewById(R.id.account_navigationView);
        settingsNavigationView = findViewById(R.id.settings_navigationView);

        navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout);
        NavigationUI.setupWithNavController(accountNavigationView, navController);
        NavigationUI.setupWithNavController(settingsNavigationView, navController);

        accountNavigationView.setNavigationItemSelectedListener(this);
        settingsNavigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return NavigationUI.navigateUp(drawerLayout, Navigation.findNavController(this, R.id.nav_host_fragment));
    }

    @Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
            drawerLayout.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        menuItem.setChecked(true);
        drawerLayout.closeDrawers();
        int id = menuItem.getItemId();
        switch (id) {
            case R.id.home:
                navController.navigate(R.id.homeFragment);
                break;
            case R.id.locations:
                navController.navigate(R.id.locationsFragment);
                break;
            case R.id.saved:
                navController.navigate(R.id.savedFragment);
                break;
        }

        return true;
    }
}

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity" />

    <!--Account-->
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity"
        tools:layout_editor_absoluteX="0dp">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />

        <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph" />

        <com.google.android.material.navigation.NavigationView
            android:id="@+id/account_navigationView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/header_layout"
            app:menu="@menu/account_drawer_menu" />

        <!--Settings-->
        <com.google.android.material.navigation.NavigationView
            android:id="@+id/settings_navigationView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/header_layout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/distance_text"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_alignTop="@id/distance_seekbar"
                    android:layout_marginLeft="10dp"
                    android:textStyle="bold"
                    android:text="Distance" />

                <SeekBar
                    android:id="@+id/distance_seekbar"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:max="200"/>

            </LinearLayout>

        </com.google.android.material.navigation.NavigationView>


    </androidx.drawerlayout.widget.DrawerLayout>


    <com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_navigation"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@android:color/white"
    app:itemTextColor="@android:color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:menu="@menu/bottom_nav_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</androidx.constraintlayout.widget.ConstraintLayout>

如何使它再次起作用,以便地图可缩放和移动?感谢您的阅读和任何帮助!

1 个答案:

答案 0 :(得分:0)

也许您的DrawerLayout与您的地图片段重叠,形成了一个图层,以防止您与地图互动。

尝试在DrawerLayout中添加地图片段以进行测试

如有必要,请评论/隐藏您的Navigation Host Fragment

如果地图可以按预期工作,则可以创建一个accountNavigationView之类的新视图,然后将地图添加到Navigation Host Fragment中,如下所示:

NavigationUI.setupWithNavController(mapView, navController);

下面的测试建议:

<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity"
    tools:layout_editor_absoluteX="0dp">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize" />

     <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity" />

    <fragment            
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/account_navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/header_layout"
        app:menu="@menu/account_drawer_menu" />

    <!--Settings-->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/settings_navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/header_layout">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/distance_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignTop="@id/distance_seekbar"
                android:layout_marginLeft="10dp"
                android:textStyle="bold"
                android:text="Distance" />

            <SeekBar
                android:id="@+id/distance_seekbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:max="200"/>

        </LinearLayout>

    </com.google.android.material.navigation.NavigationView>

</androidx.drawerlayout.widget.DrawerLayout>