4

In the process of learning Kotlin with Android, the failure to compile and generally unhelpful error text have left me stumped. The error text says the following:

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

In both instances the Fragment! text is highlighted in red. I am aware that Kotlin refers to Java classes with an !, but I can't seem to understand why it is not happy with the way in which I provided the inputs.

Any insight would be greatly appreciated.

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

}

The EditRoutine class being referenced:

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
    }
}
Josh Ribeiro
  • 1,349
  • 3
  • 18
  • 28

3 Answers3

8

Try this: ft.add(R.id.container_all, frag as Fragment).commit()

0

JvmStatic : this annotation is required (documentation)

companion object {

/**
 * @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
}

}

Arun Shankar
  • 2,295
  • 16
  • 20
0

The answer with casting fragment as Fragment didn't help me, it still wont compile.

So I used the advise from BladeCoder and replaced fragmentManager with 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()

}

All thanks to BladeCoder

acmpo6ou
  • 840
  • 1
  • 12
  • 21