将 MapActivity (FragmentActivity) 添加到 Navigation Drawers (Fragment)

Posted

技术标签:

【中文标题】将 MapActivity (FragmentActivity) 添加到 Navigation Drawers (Fragment)【英文标题】:adding a MapActivity (FragmentActivity) to Navigation Drawers (Fragment) 【发布时间】:2020-12-12 02:12:50 【问题描述】:

我正在尝试在 android Studio 中学习编码,但在活动方面遇到了问题。

我有一个要添加到导航抽屉的谷歌地图代码,但我不能,因为错误总是说 MapsActivity 无法转换为 androidx.fragment.app.Fragment

这是我的 MapActivity.Java

package ***.***.***.ui.map;
import androidx.fragment.app.FragmentActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

import java.io.IOException;
import java.util.List;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback 

    private Object LocationServices;
    GoogleMap mMap;
    private GoogleMap.OnCameraIdleListener onCameraIdleListener;
    private TextView resutText;

    @Override
    public void onResume() 
        super.onResume();
        // 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);
        resutText = (TextView) findViewById(***.***.***.R.id.dragg_result);
        configureCameraIdle();
    

    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
        mMap.setOnCameraIdleListener(onCameraIdleListener);
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        @SuppressLint("MissingPermission") android.location.Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
        double userLat = lastKnownLocation.getLatitude();
        double userLong = lastKnownLocation.getLongitude();
        LatLng user = new LatLng(userLat, userLong);
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(userLat, userLong), 16.0f));
    
    private void configureCameraIdle() 
        onCameraIdleListener = new GoogleMap.OnCameraIdleListener() 
            @Override
            public void onCameraIdle() 

                LatLng latLng = mMap.getCameraPosition().target;
                Geocoder geocoder = new Geocoder(MapsActivity.this);

                try 
                    List<Address> addressList = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
                    if (addressList != null && addressList.size() > 0) 
                        String locality = addressList.get(0).getAddressLine(0);
                        String country = addressList.get(0).getCountryName();
                        if (!locality.isEmpty() && !country.isEmpty())
                            resutText.setText(locality + "  " + country);
                    

                 catch (IOException e) 
                    e.printStackTrace();
                

            
        ;
    

    protected void setStatusBarTranslucent(boolean makeTranslucent) 
        if (makeTranslucent) 
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
         else 
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        
    



activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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_
    android:layout_
    android:orientation="vertical">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_
        android:layout_
        tools:context=".MapsActivity" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="172dp"
        android:layout_marginTop="310dp"
        android:layout_marginEnd="172dp"
        android:layout_marginBottom="356dp"
        android:adjustViewBounds="true"
        android:maxWidth="65dp"
        android:maxHeight="65dp"
        android:src="@drawable/car_pin" />
    <!-- Implementation of find my location button -->

    <TextView
        android:id="@+id/dragg_result"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="75dp"
        android:layout_marginTop="74dp"
        android:layout_marginEnd="75dp"
        android:layout_marginBottom="572dp"
        android:text="TextView" />

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_
        android:layout_
        app:defaultNavHost="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />



</RelativeLayout>

还有 MainActivity.java

package ***.***.***;

import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity 

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            
        );
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    

    @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 onSupportNavigateUp() 
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    


如何在不重做所有代码的情况下使其正常工作,提前致谢。

【问题讨论】:

【参考方案1】:

我不太确定,但我认为您必须将 &lt;framgent&gt; 放入 xml 文件中的 &lt;FramgeLayout&gt; 中,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <fragment
        android:id="@+id/mapfragment"
        android:layout_
        android:layout_
        class="com.google.android.gms.maps.MapFragment"/>

<!-- other components -->

   <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_
        android:layout_
        app:defaultNavHost="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />
</FrameLayout>

您的导入可能是错误的。如果你在你的java类android.support.v4.app.FragmentActivity而不是androidx.fragment.app.FragmentActivity中导入它会起作用吗?我认为错误在于导入而不是

【讨论】:

由于public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,我仍然收到错误但如果它是片段,我的代码将无法工作

以上是关于将 MapActivity (FragmentActivity) 添加到 Navigation Drawers (Fragment)的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 Android 应用程序/进程使用多个 MapActivity/MapViews

从 Firebase 检索位置数据未进入 MapActivity

MapActivity android studio

带有 10 个标记的 Android 基本 API v2 MapActivity outOfMemory

OnLoadFinished() 调用了两次

片段中的 MapView(蜂窝)