当前位置: 首页 > 知识库问答 >
问题:

如何修复"未解决的引用"时传递上下文与this@MapsActivity

顾俊楚
2023-03-14

问题摘要

>

当我尝试将MapsActivity的上下文传递给mapFragment中的方法isGpsEnable()时,我得到了错误Unresolved引用:@MapsActivity

我有一个闪屏ctivity.kt清单上有

我所尝试过的

  • 清单中的活动名称是正确的
  • 我两者都试过了this@MapsActivity和this@SplashActivity
  • 包名**正确*
  • 重新启动/使etc无效
  • 使用了requireContext(),它可以工作,但不知道这是否是解决此问题的正确方法
  • 在OnMapReady中调用isGpsEnable()方法

Androidanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="gr.mantis_project.obdLogger">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application
        <activity
                android:name="gr.example.obdLogger.SplashActivity"
                android:label="@string/title_activity_maps"
                android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
                android:name="gr.example.obdLogger.MapsActivity">
        </activity>
    </application>
</manifest>

地图ctivity.kt

package gr.example.obdLogger

class MapsActivity : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnMapClickListener {
    override fun onMapReady(p0: GoogleMap?) {
    }
    override fun onMapClick(p0: LatLng?) {
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivitymainBinding =
            DataBindingUtil.setContentView(this, R.layout.mapsactivity)
        setSupportActionBar(findViewById(R.id.toolbar))
    }

MAPFragment.kt

package gr.example.obdLogger

class MapFragment : Fragment(), OnMapReadyCallback {

    private lateinit var mMapView: MapView
    private lateinit var mMap: GoogleMap
    private lateinit var mView: View
    private lateinit var fusedLocationClient: FusedLocationProviderClient
    private lateinit var lastLocation: Location

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mMapView.onSaveInstanceState(outState)
        isGpsEnable()  
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_map, container, false)

        mMapView = view?.findViewById(R.id.mapview) as MapView
        mMapView.onCreate(savedInstanceState)
        mMapView.getMapAsync(this)

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    override fun onResume() {
        super.onResume()
        mMapView.onResume()
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        mMap.uiSettings.isZoomControlsEnabled = true      
    }

    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 1
    }

    private fun isGpsEnable(): Boolean {
        if (ActivityCompat.checkSelfPermission(
                requireContext(),   // **This works**
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this@MapsActivity, // **This is unresolved**
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            requestPermissions(
                arrayOf(
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
                ),
                LOCATION_PERMISSION_REQUEST_CODE
            )
        } else {
            Log.e("DB", "PERMISSION GRANTED")
        }
        return true
    }
}

共有2个答案

洪建茗
2023-03-14

这行不通<代码>映射活动不是片段的外部范围。您可以在此处阅读更多有关限定的信息

孔鸿远
2023-03-14

从MapFrarix到MapsActive没有内部依赖关系,因此不能将MapsActive引用为外部引用。外部引用只适用于内部类(注意lambda函数是匿名的内部类,因此您也可以使用this@来引用外部作用域)。如果你需要一个上下文在你的应用程序,你可以调用nullSafe要求Context()方法在MapFrapt或引用的MapsActive实例通过

    (activity as MainActivity)

一个片段可以通过它的属性活动访问它附加到的活动,这就是为什么(活动为Main活动)工作

当使用可为空的值时,我喜欢使用?使用let链接的运算符,例如context?。让{doStuff(it)}这样您就安全了,不会得到nullptr异常

 类似资料:
  • 在开发新产品时,我创建了一个后端和前端项目。对于前端,我使用带有Typescript的角度框架。下面是一个问题,因为我对这门语言还不熟悉(几天前)。我的问题是关于回调以及如何避免“this”上下文中的显式传递。我已经阅读了一些资源,我将链接它们。 下面我将为HttpClient实现一个包装器。快速版本是使用插件架构(由角度路由支持)的模块进行流控制,最好是通过使用观察员和订阅者广播401之类的错误

  • 在我的一个REST服务中,我使用Spring Security性来验证在头中传递的令牌。然而,spring无法找到“authorization”标头,尽管它在那里。当在测试中测试时,甚至在本地测试时,这都不是一个问题,但当我们部署到PROD时,我们就会遇到这个问题。 作为替代/变通方法,我删除了Spring Security性,而是尝试在实际endpoint中验证我的令牌,然后继续处理请求的其余部

  • 问题内容: 如何传递上下文?我想打电话,如果在1000毫秒。我怎样才能做到这一点? 当我尝试上述操作时,指的是窗口。 问题答案: 编辑: 总而言之,早在2010年,当有人问这个问题时,解决此问题的最常用方法是保存对进行函数调用的上下文的引用,因为执行函数时要指向全局对象: 在一年前发布的ES5规范中,它引入了该方法,但最初的答案中并未建议使用该方法,因为该方法尚未得到广泛支持,您需要使用polyf

  • 类似的问题没有解决我的问题:https://stackoverflow.com/a/36633892/2300773 在基于connect()的场景中使用 通过上下文传递存储区不起作用 由于react-router不将当前param作为上下文提供,所以我选择将当前param作为路由组件中的上下文添加。我可以一直访问组件树下的上下文,直到到达使用connect()设置的子组件为止。页面的初始呈现为子

  • 问题内容: 有什么方法可以轻松解决此问题,或者我真的需要重写所有旧代码吗? PHP致命错误:第30行的…中的调用时传递引用已被删除 当变量在整个代码中作为引用传递给函数时,这种情况随处可见。 问题答案: 您应该在函数定义中通过引用表示调用,而不是实际调用。由于PHP在5.3版中开始显示弃用错误,因此我想重写代码是一个好主意。 从文档中: 函数调用上没有参考符号-仅在函数定义上。 仅函数定义就足以正

  • FileLoaderImportCircularReferenceException:在“/app/config/routing_dev.yml”(“/app/config/routing_dev.yml”)中检测到循环引用 我正在努力做到这一点:http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html#mor