FragmentTransaction 不会在 Kotlin Android 项目中编译
FragmentTransaction won't Compile in Kotlin Android Project
在使用Android学习Kotlin的过程中,编译失败和通常无用的错误文本让我很困惑。错误文本内容如下:
None of the following functions can be called with the arguments
supplied. add(Fragment!, String!) defined in
android.app.FragmentTransaction add(Int, Fragment!) defined in
android.app.FragmentTransaction
在这两种情况下,Fragment! 文本都以红色突出显示。我知道 Kotlin 指的是带有 ! 的 Java classes,但我似乎无法理解为什么它对我提供输入的方式不满意。
如有任何见解,我们将不胜感激。
fun displayEditRoutine(){
//Set our variables
var ft = fragmentManager.beginTransaction()
//Basic "newInstance" constructor to avoid omitting necessary variables
var frag = EditRoutine.newInstance(mRoutineID,this)
//Here is where error occurs
ft.add(R.id.are_container, frag).commit()
}
正在引用的 EditRoutine class:
class EditRoutine : Fragment() {
//Variables
private var mRoutineID: String? = null
private var mListener: OnEditRoutineFragmentListener? = null
//Views
@BindView(R.id.fer_routineName) internal var vRoutine: TextInputEditText? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
mRoutineID = arguments.getString(Keys.b_RoutineID)
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val v = inflater.inflate(R.layout.fragment_edit_routine, container, false)
ButterKnife.bind(activity)
return v
}
// TODO: Rename method, update argument and hook method into UI event
fun onButtonPressed(): Unit{
if (mListener != null && vRoutine!!.text.toString() != "") {
val contentValues = ContentValues()
contentValues.put(Routine.Table.KEY_NAME, vRoutine!!.text.toString())
//Pass the values into the interface
mListener!!.onDoneClicked(contentValues)
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is OnEditRoutineFragmentListener) {
mListener = context
} else {
throw RuntimeException(context.toString() + " must implement OnEditRoutineFragmentListener")
}
}
override fun onDetach() {
super.onDetach()
mListener = null
}
//Internal Methods
//Interface
interface OnEditRoutineFragmentListener {
// TODO: Update argument type and name
fun onDoneClicked(cv: ContentValues)
}
companion object {
/**
* @param routineID = passed ID. If null, don't load content values
* *
* @return A new instance of fragment EditRoutine.
*/
fun newInstance(routineID: String, ctx: Context): EditRoutine {
val fragment = EditRoutine()
val args = Bundle()
args.putString(Keys.b_RoutineID, routineID)
fragment.arguments = args
return fragment
}
}
试试这个:
ft.add(R.id.container_all, frag as Fragment).commit()
JvmStatic : 此注释是必需的 (documentation)
伴随对象{
/**
* @param routineID = passed ID. If null, don't load content values
* *
* @return A new instance of fragment EditRoutine.
*/
@JvmStatic
fun newInstance(routineID: String, ctx: Context): EditRoutine {
val fragment = EditRoutine()
val args = Bundle()
args.putString(Keys.b_RoutineID, routineID)
fragment.arguments = args
return fragment
}
}
将片段转换为 Fragment
的答案对我没有帮助,它仍然无法编译。
所以我使用了 BladeCoder 的建议并将 fragmentManager
替换为 supportFragmentManager
:
fun displayEditRoutine(){
//Set our variables
var ft = supportFragmentManager.beginTransaction()
//Basic "newInstance" constructor to avoid omitting necessary variables
var frag = EditRoutine.newInstance(mRoutineID,this)
//Here is where error occurs
ft.add(R.id.are_container, frag).commit()
}
在使用Android学习Kotlin的过程中,编译失败和通常无用的错误文本让我很困惑。错误文本内容如下:
None of the following functions can be called with the arguments supplied. add(Fragment!, String!) defined in android.app.FragmentTransaction add(Int, Fragment!) defined in android.app.FragmentTransaction
在这两种情况下,Fragment! 文本都以红色突出显示。我知道 Kotlin 指的是带有 ! 的 Java classes,但我似乎无法理解为什么它对我提供输入的方式不满意。
如有任何见解,我们将不胜感激。
fun displayEditRoutine(){
//Set our variables
var ft = fragmentManager.beginTransaction()
//Basic "newInstance" constructor to avoid omitting necessary variables
var frag = EditRoutine.newInstance(mRoutineID,this)
//Here is where error occurs
ft.add(R.id.are_container, frag).commit()
}
正在引用的 EditRoutine class:
class EditRoutine : Fragment() {
//Variables
private var mRoutineID: String? = null
private var mListener: OnEditRoutineFragmentListener? = null
//Views
@BindView(R.id.fer_routineName) internal var vRoutine: TextInputEditText? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
mRoutineID = arguments.getString(Keys.b_RoutineID)
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val v = inflater.inflate(R.layout.fragment_edit_routine, container, false)
ButterKnife.bind(activity)
return v
}
// TODO: Rename method, update argument and hook method into UI event
fun onButtonPressed(): Unit{
if (mListener != null && vRoutine!!.text.toString() != "") {
val contentValues = ContentValues()
contentValues.put(Routine.Table.KEY_NAME, vRoutine!!.text.toString())
//Pass the values into the interface
mListener!!.onDoneClicked(contentValues)
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is OnEditRoutineFragmentListener) {
mListener = context
} else {
throw RuntimeException(context.toString() + " must implement OnEditRoutineFragmentListener")
}
}
override fun onDetach() {
super.onDetach()
mListener = null
}
//Internal Methods
//Interface
interface OnEditRoutineFragmentListener {
// TODO: Update argument type and name
fun onDoneClicked(cv: ContentValues)
}
companion object {
/**
* @param routineID = passed ID. If null, don't load content values
* *
* @return A new instance of fragment EditRoutine.
*/
fun newInstance(routineID: String, ctx: Context): EditRoutine {
val fragment = EditRoutine()
val args = Bundle()
args.putString(Keys.b_RoutineID, routineID)
fragment.arguments = args
return fragment
}
}
试试这个:
ft.add(R.id.container_all, frag as Fragment).commit()
JvmStatic : 此注释是必需的 (documentation)
伴随对象{
/**
* @param routineID = passed ID. If null, don't load content values
* *
* @return A new instance of fragment EditRoutine.
*/
@JvmStatic
fun newInstance(routineID: String, ctx: Context): EditRoutine {
val fragment = EditRoutine()
val args = Bundle()
args.putString(Keys.b_RoutineID, routineID)
fragment.arguments = args
return fragment
}
}
将片段转换为 Fragment
的答案对我没有帮助,它仍然无法编译。
所以我使用了 BladeCoder 的建议并将 fragmentManager
替换为 supportFragmentManager
:
fun displayEditRoutine(){
//Set our variables
var ft = supportFragmentManager.beginTransaction()
//Basic "newInstance" constructor to avoid omitting necessary variables
var frag = EditRoutine.newInstance(mRoutineID,this)
//Here is where error occurs
ft.add(R.id.are_container, frag).commit()
}