Main Activity 不创建上下文

Main Activity does not create Context

我需要为新 Activity 提供一些 String 内容,并且我需要在单击 RecyclerView 上的项目时执行此操作。我的策略是从 RecyclerView 创建一个接口(实例化 MainActivity 的实例),然后从 MainActivity 我启动一个显式的 Intent。 这是我的适配器(所以请注意不是主要的Activity):

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


            })

界面同class:

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

并且在 MainActivity 中,编译器在 //error

指示的行启动错误

:

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.onClick(BezinningAdapter.kt:70)

我的猜测是没有调用上下文,我不应该从适配器初始化 MainClass。我该怎么做才能传递一个字符串以便打开另一个 Activity?

-O-o-o-o-o-o-o-o-o-o-

编辑: 根据 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,没有错误 但是 class 没有启动 两件奇怪的事:

1)第一件奇怪的事 startActivity 要求我提供三个参数而不是一个 导入这个库(无多选) import android.support.v4.content.ContextCompat.startActivity

2)第二件奇怪的事 我以为我之前必须按照 Commonsware 指示声明上下文 所以我以这种方式检索了`startActivity(intent)//一个参数:

view.context.startActivity(intent)

我仍然得到一个 Activity 空的,我不知道哪个 Activity 是,我把日志放在 Main 和我的 Activity 目标上,但它们没有被调用,我有还添加了一些 <TextView 和一些硬编码文本来识别 activity,但不起作用, Activity 目标未启动,我不知道如何调试意图,我尝试检查 Intent class

也没有成功

编辑 2: 对于 mTak

这是我的适配器 class:

    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()


    }
    }

您不能通过构造函数自行创建 Context,例如 var mainActivity: MainActivity = MainActivity()。你从别的地方得到了 Context。在您的情况下,您有一个 View,并且 View 有一个名为 getContext() 的 Java 方法,您可以在 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 returns,但应该相当接近)

像这样更改适配器的 header:

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

现在,当您从 MainActivity 初始化它时,您需要将 this 作为参数传递。
接下来在适配器的 header 下声明:

private val parentActivity: MainActivity = context as MainActivity

现在像这样尝试您以前的代码:

parentActivity.injectText(item!!)

我不知道你为什么要使用那个界面,而你本可以只使用一个常规的 public 函数来代替 injectText()