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()
我需要为新 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()