【问题标题】:Kotlin - Type mismatch: required: Context found: Context?Kotlin - 类型不匹配:必需:找到上下文:上下文?
【发布时间】:2018-10-11 05:43:30
【问题描述】:

我尝试制作一个 PopupMenu

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    menu_btn.setOnClickListener {
        var menu: PopupMenu?
        menu = PopupMenu(this.context, it)
        menu.inflate(R.menu.card_menu)

        menu.setOnMenuItemClickListener {
            when(it.itemId) {
                R.id.menu_modify -> { Toast.makeText(context, "Modify", Toast.LENGTH_LONG).show()
                    true }

                R.id.menu_delete -> { Toast.makeText(context, "Delete", Toast.LENGTH_LONG).show()
                    true }

                else -> false
            }
        }

        menu.show()
    }
}

但我在

下得到了一条红线
menu = PopupMenu(this.context, it)

上面说: 类型不匹配。 必需的: 语境 成立: 上下文?

甚至当我使用 !! - 我得到这个错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at com.example.emek1.myapplication.FragmentOne.onCreate(FragmentOne.kt:24)
    at android.support.v4.app.Fragment.performCreate(Fragment.java:2414)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)
    at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
    at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
    at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:146)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1244)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1092)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1622)

注意:它不在 MainActivity.kt 中 这是一个片段。

【问题讨论】:

  • 如果它的片段你不能在 onCreate 方法中使用“menu_btn.setOnClickListener”。因为视图不会在那里初始化。尝试在膨胀视图后在“onCreateView”方法中添加此方法。
  • menu_btn 为空

标签: android kotlin


【解决方案1】:

编写这段代码

context?.let {
    menu = PopupMenu(it, view)
}

此处的视图将是您的弹出窗口的锚视图。

而不是

menu = PopupMenu(this.context, it)

【讨论】:

    【解决方案2】:

    NullPointerException 源于 onCreate()onCreateView() 之前运行的事实,这会膨胀您的视图层次结构。因此menu_btn 仍然为空,因为没有找到。再看看Fragments 生命周期。

    对于弹出窗口,最好使用View 参数it.context 中的Context

    【讨论】:

      【解决方案3】:

      如果它是一个片段,你应该像这样调用上下文。

      menu = PopupMenu(activity!!, it)

      或者如果你有最新的库,你可以做这样的事情

      menu = PopupMenu(requireActivity(), it)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多