Kotlin - несоответствие типов: требуется: контекст найден: контекст? - PullRequest
0 голосов
/ 11 октября 2018

Я пытался создать 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)

, которая говорит: Несоответствие типов.Обязательно: контекст найден: Contex?

и даже когда я использую !!- Я получаю эту ошибку

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 Это фрагмент.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

NullPointerException вытекает из того факта, что onCreate() запускается до onCreateView(), что увеличивает вашу иерархию представлений.Поэтому menu_btn все еще нулевой, потому что не найден.Посмотрите еще раз на жизненный цикл Фрагменты .

Для всплывающего окна может быть лучше использовать Context из параметра View it.context.

0 голосов
/ 11 октября 2018

Введите этот код

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

Здесь представление будет вашим якорным представлением всплывающего окна.

вместо

menu = PopupMenu(this.context, it)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...