2017-06-12 4 views
2

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 
    } 
} 
+2

Si vous créez des fragments de support, vous devez utiliser supportFragmentManager au lieu de fragmentManager – BladeCoder

+0

Pouvez-vous publier votre classe 'EditRoutine'? – Marce

+0

Merci pour la suggestion. Mon API min est 19, donc j'utilise des Fragments réguliers –

Répondre

3

Essayez ceci: ft.add(R.id.container_all, frag as Fragment).commit()

+0

Cela a fonctionné, je suppose que Kotlin ne pouvait pas voir le parent de ma classe –

0

JvmStatic: cette annotation est nécessaire (documentation)

objet compagnon {

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

}