Dans le processus d'apprentissage de Kotlin avec Android, l'échec de la compilation et le texte d'erreur généralement inutile m'a laissé perplexe. Le texte d'erreur indique ce qui suit:FragmentTransaction ne compilera pas dans Kotlin Android Project
Aucune des fonctions suivantes ne peut être appelée avec les arguments fournis. ajouter (Fragment !, chaîne!) définie dans android.app.FragmentTransaction add (Int, Fragment!) défini dans android.app.FragmentTransaction
Dans les deux cas, le Fragment! Le texte est surligné en rouge. Je suis conscient que Kotlin se réfère aux classes Java avec un!, Mais je n'arrive pas à comprendre pourquoi il n'est pas satisfait de la façon dont j'ai fourni les entrées.
Toute idée serait grandement appréciée.
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()
}
La classe EditRoutine référencé:
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
}
}
Si vous créez des fragments de support, vous devez utiliser supportFragmentManager au lieu de fragmentManager – BladeCoder
Pouvez-vous publier votre classe 'EditRoutine'? – Marce
Merci pour la suggestion. Mon API min est 19, donc j'utilise des Fragments réguliers –