Основная деятельность не создает контекст - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно предоставить некоторый контент String для нового занятия, и мне нужно сделать это, когда щелкнет элемент на RecyclerView.Моя стратегия от RecyclerView Я создаю интерфейс (создание экземпляра MainActivity) и от MainActivity я запускаю явный Intent.Это мой адаптер (поэтому обратите внимание, что это не MainActivity):

var mainActivity: MainActivity = MainActivity()//because i need to call an interface, please see below

override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) {

    holder.bindData(label.get(position).attribute.label.toString())

    holder.itemView.setOnClickListener(
            View.OnClickListener { view ->
                //val JSONResponseBody = bezinningModels!![position].attribute.body
                val item = label.get(position).attribute.body
                //Log.d("IVO", "item: "+item);
                //val message = editText.text.toString()
                Log.d("IVO", "touched: ");




                mainActivity.injectText(item!!)//an interface launch this, see below


            })

интерфейс находится в том же классе:

public interface LaunchBezinning {
fun injectText(bezinningText: String)
}

и в MainActivity компилятор запускает ошибкув строке, обозначенной // ошибкой

:

class  MainActivity : AppCompatActivity(),LaunchBezinning {

override fun injectText(bezinningText: String) {

    val intent = Intent(this@MainActivity , BezinningContentActivity::class.java)//error

    intent.putExtra(EXTRA_MESSAGE, bezinningText)
    startActivity(intent)
}

Я хотел бы перейти на BezinningContentActivity дополнительно, но я получаю ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
        at android.content.ComponentName.<init>(ComponentName.java:130)
        at android.content.Intent.<init>(Intent.java:5780)
        at ivano.android.com.bezinning.ui.bezinningList.MainActivity.injectText(MainActivity.kt:14)
        at ivano.android.com.bezinning.ui.bezinningList.BezinningAdapter$onBindViewHolder$1.onClick(BezinningAdapter.kt:70)

Я предполагаю, что контекст не вызывается, что я не должен инициализировать из адаптера MainClass.Что я могу сделать, чтобы передать строку, чтобы открыть другое действие?

-Oooooooooo-

РЕДАКТИРОВАТЬ: согласно справке CommonsWare, которую я запускаю из onBindViewHolder этого фрагмента:

holder.itemView.setOnClickListener(
        View.OnClickListener { view ->
            val intent = Intent(view.context, BezinningContentActivity::class.java)

            intent.putExtra(EXTRA_MESSAGE, label.get(position).attribute.body ?: "")
            startActivity(intent)
        })

исчезает RecyclerView и появляется пустой Activity, ошибок нет, но класс не запускается две странные вещи:

1) Первая странная вещь startActivity попросила у меня три параметра вместо одного импорта этой библиотеки (без нескольких вариантов выбора) import android.support.v4.content.ContextCompat.startActivity

doc startActivity three parameters from Compat v4

2) Вторая странная вещь Я думал, что раньше мне нужно было объявить контекст, как указало Commonsware, поэтому я получил один из параметров `startActivity (intent) // // следующим образом:

view.context.startActivity (intent)

Тем не менее, я получаю Activity пустым, и я понятия не имею, что такое Activity, я помещаю журнал в Main, и моя цель Activity и онине называются, я также добавил некоторые <TextViewс некоторым жестко закодированным текстом для распознавания действия, но не работает, цель Activity не запущена, и я не знаю, как отлаживать намерение, я также безуспешно пытался исследовать Intent class

EDIT 2: для mTak

вот мой класс адаптера:

    internal class BezinningAdapter : RecyclerView.Adapter<SimpleViewHolder>() {
   //    lateinit var context: Context
   // var mainActivity: MainActivity = MainActivity()


    var label = ArrayList<BezinningModel>()


    //it requires minimum these three methods to work

    //returns a ViewHolder for positioning in our view
    //creates new View holder invoked by the layout manager
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.view_recyclerview_row, parent, false)
        //context = view.context
        return SimpleViewHolder(view)
    }


    //giving a position
    // Replace the contents of a view (invoked by the layout manager)
    override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element


        holder.bindData(label.get(position).attribute.label.toString())

        holder.itemView.setOnClickListener(
                View.OnClickListener { view ->
                    val item = label.get(position).attribute.body
                    val 
      intent=Intent(view.context,BezinningContentActivity::class.java)
                    intent.putExtra(EXTRA_MESSAGE,item)
    //startActivity(view.context,intent,null)//first one see Edit1
                    view.context.startActivity(intent)//second one passing Context

                    Log.d("IVO", "touched: ");

                    Log.d("IVO", "passed interface in Main: "+intent);




                })

    }

    override fun getItemCount(): Int {
        return label.size
    }

    public fun setTitleData(bezinningModels: List<BezinningModel>) {
        if (bezinningModels == null) {
            return
        }
        label.addAll(bezinningModels)
        notifyDataSetChanged()


    }
    }

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Измените заголовок вашего адаптера следующим образом:

internal class BezinningAdapter(context: Context) : RecyclerView.Adapter<SimpleViewHolder>()

теперь, когда вы инициализируете его с MainActivity, вам нужно передать this в качестве параметра.Затем объявите это под заголовком адаптера:

private val parentActivity: MainActivity = context as MainActivity

Теперь попробуйте ваш предыдущий код следующим образом:

parentActivity.injectText(item!!)

Я не знаю, почему вы используете этот интерфейс, когда вы могли бы использовать обычную общедоступную функцию вместо injectText()

0 голосов
/ 27 августа 2018

Вы не можете создать Context самостоятельно с помощью конструктора, такого как var mainActivity: MainActivity = MainActivity().Вы получаете Context от чего-то другого.В вашем случае у вас есть View, а View имеет Java-метод с именем getContext(), который в Kotlin можно ссылаться на context.

Итак, замените существующий OnClickListener на:

holder.itemView.setOnClickListener(
        View.OnClickListener { view ->
            val intent = Intent(view.context, BezinningContentActivity::class.java)

            intent.putExtra(EXTRA_MESSAGE, label.get(position).attribute.body ?: "")
            startActivity(intent)
        })

(для этого может потребоваться небольшое изменение, поскольку я не знаю, что возвращает label.get(position).attribute.body, но оно должно быть достаточно близко)

...