主要活动不会创建上下文

时间:2018-08-26 22:11:38

标签: android android-intent android-recyclerview kotlin android-context

我需要为新的活动提供一些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中,编译器在// 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$1.onClick(BezinningAdapter.kt:70)

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

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

编辑: 根据我从onBindViewHolder启动的这段代码的CommonsWare帮助:

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要求我输入三个参数,而不是一个 导入此库(无选择)导入android.support.v4.content.ContextCompat.startActivity

doc startActivity three parameters from Compat v4

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

  

view.context.startActivity(intent)

我仍然没有一个活动,我不知道哪个活动是什么,我将日志放在Main中,并且我的Activity目标没有被调用,我还添加了一些<TextView以及一些硬编码文本来识别活动,但不起作用, 活动目标尚未启动,并且我不知道如何调试意图,因此我也尝试了Intent

,但没有成功

编辑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 :(得分:2)

您不能通过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返回什么,但是应该相当接近)

答案 1 :(得分:1)

像这样更改适配器的标题:

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

现在,当您从MainActivity对其进行初始化时,您需要传递this作为参数。
接下来,在适配器的标头下声明此内容:

private val parentActivity: MainActivity = context as MainActivity

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

parentActivity.injectText(item!!)

我不知道为什么您只使用常规的公共功能来代替injectText()