2017-06-20 93 views
1

指定我從片段運行GirlQualitiesChoiceDialog像下面拉姆達解僱DialogFragment:如何從主叫科特林

 girlType.setOnClickListener { 
       GirlQualitiesChoiceDialog.show(activity, InitialDataSet.instance.QUALITY_TYPE_COLOR){ 
       Picasso.with(context).load(it.resId).into(colorTypeImage as ImageView) 
      //GirlQualitiesChoiceDialog.this.dismiss() - need to dismiss the created dialog 
       } 
     } 

凡註明聽衆。我需要的是在我加載圖片後關閉對話框。 GirlQualitiesChoiceDialog.this.dismiss()不起作用。

有人可以告訴我,我該怎麼解僱GirlQualitiesChoiceDialog在這裏?假設我需要將對話回調以某種方式傳遞給lambda,但無法實現。

下面是我的對話框的代碼:

class GirlQualitiesChoiceDialog : DialogFragment() { 

    companion object { 
     val ARG_QUALITY_TYPE = "ARG_QUALITY_TYPE" 

     private lateinit var itemClickInterface: (Quality) -> Unit 

     fun show(activity: Activity, qualityType: Int, itemClick: (Quality) -> Unit) { 
      itemClickInterface = itemClick 
      GirlQualitiesChoiceDialog().apply { 
       arguments = Bundle().apply { 
        putInt(ARG_QUALITY_TYPE, qualityType) 
       } 
      }.show((activity as AppCompatActivity).supportFragmentManager, TAG) 
     } 
    } 

    private lateinit var adapter: QualitiesAdapter 

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 

     val choiceDialogView = activity.getLayoutInflater().inflate(horizontal_list_view, null) 
     val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) 
     choiceDialogView.horisontalCardsRecyclerView.setLayoutManager(layoutManager) 

     with(ItemClickSupport.addTo(choiceDialogView.horisontalCardsRecyclerView)) { 
      setOnItemLongClickListener { recyclerView, position, v -> 
       val quality = v.getTag() as Quality; 
       dismiss() 
       true 
      } 
     } 

     var qualityType = arguments.getInt(ARG_QUALITY_TYPE) 

     var title = -1 
     when (qualityType) { 
      InitialDataSet.instance.QUALITY_TYPE_COLOR -> { 
       title = R.string.choose_color_type 
       adapter = QualitiesAdapter(InitialDataSet.instance.qualities, itemClickInterface) 
      } 
     } 

     choiceDialogView.horisontalCardsRecyclerView.adapter = adapter 

     return AlertDialog.Builder(activity) 
       .setTitle(title) 
       .setView(choiceDialogView) 
       .create() 
    } 
} 

和適配器

class QualitiesAdapter(val qualities: List<Quality>, val itemClick: (Quality) -> Unit) : 
    RecyclerView.Adapter<QualitiesAdapter.ViewHolder>() { 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
    val view = LayoutInflater.from(parent.context).inflate(R.layout.selection_card, parent, false) 
    return ViewHolder(view, itemClick) 
} 

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.bindForecast(qualities[position]) 
} 

override fun getItemCount() = qualities.size 

class ViewHolder(view: View, val itemClick: (Quality) -> Unit) : RecyclerView.ViewHolder(view) { 

    fun bindForecast(quality: Quality) { 
     with(quality) { 
      Picasso.with(itemView.context).load(resId).into(itemView.selectionImage) 
      (itemView as BaseCardView).setStatusLabel(desc) 
      itemView.setTag(quality) 
      itemView.setOnClickListener { itemClick(this) } 
     } 
    } 
} 
+0

https://kotlinlang.org/docs/reference/this-expressions.html#qualified –

+0

這不是我可以在這裏使用的。我只能做這個@ AddGirlFragment,但不能這樣@ GirlQualitiesChoiceDialog。 AddGirlFragment是我打開GirlQualitiesChoiceDialog的片段。但我需要解除GirlQualitiesChoiceDialog。所以我需要通過一些鏈接將GirlQualitiesChoiceDialog傳遞給setOnClickListener主體。 –

回答

0

我建議你從你的表演方法返回對話框的實例,那麼你可以在調用駁回背部。

變化展現在GirlQualitiesChoiceDialog類似如下:

fun show(activity: Activity, qualityType: Int, itemClick: (Quality) -> Unit): GirlQualitiesChoiceDialog { 
     itemClickInterface = itemClick 
     val dialog = GirlQualitiesChoiceDialog().apply { 
      arguments = Bundle().apply { 
       putInt(ARG_QUALITY_TYPE, qualityType) 
      } 
     } 
     dialog.show((activity as AppCompatActivity).supportFragmentManager, TAG) 
     return dialog 
    } 

這裏的監聽器代碼:

girlType.setOnClickListener { 
    val dialog = GirlQualitiesChoiceDialog.show(activity, InitialDataSet.instance.QUALITY_TYPE_COLOR) { 
     Picasso.with(context).load(it.resId).into(colorTypeImage as ImageView) 
     dialog.dismiss() 
    } 
}