Я хочу отобразить меню (например, DialogFragment) поверх чипа, чтобы чип выглядел расширяемым, как в документации к материалу:
https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1UpLaNgayWmHV8gIGOybjBMGXfsm2KrU2%2Fentry-chip-behavior-expandable.mp4
Я на самом деле пробовал это с DialogFragmentи это работает в большинстве случаев, единственное, что я застрял с анимациями / переходами общих элементов.
Мой фрагмент:
class BookEntryContactDialog : MoneyBookDialogFragment() {
//region Variables
private lateinit var anchorPoint: Point
private var bookEntryType: Int = -1
private lateinit var contact: BookEntry.Contact
private val dataViewModel: DataViewModel by lazy {
ViewModelProviders.of(this).get(DataViewModel::class.java)
}
//endregion
//region Fragment
override fun setArguments(args: Bundle?) {
super.setArguments(args)
args?.run {
anchorPoint = Point(getInt(ARG_ANCHOR_X), getInt(ARG_ANCHOR_Y))
bookEntryType = getInt(ARG_BOOKENTRYTYPE)
contact = getParcelable(ARG_CONTACT) as BookEntry.Contact
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_bookentrycontact, container, false).also {
ViewCompat.setTransitionName(it.findViewById(R.id.vwContactTitleBackground), TITLE_VIEW_TRANSITION.format(contact.id))
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return super.onCreateDialog(savedInstanceState).apply {
val layoutParams: WindowManager.LayoutParams? = window?.attributes?.apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
x = anchorPoint.x
y = anchorPoint.y
gravity = Gravity.START or Gravity.TOP
}
window?.attributes = layoutParams
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
txvContactName.text = contact.name
chbContactMarkAsPaid.isEnabled = bookEntryType == BookEntry.Type.Claim || bookEntryType == BookEntry.Type.Debt
chbContactMarkAsPaid.isChecked = contact.hasPaid
chbContactMarkAsPaid.setOnCheckedChangeListener { _, isChecked ->
dataViewModel.update(EmbeddedContact(contact.id, contact.bookEntryId, contact.contactId, isChecked))
}
fabContactOpenAddressBook.setOnClickListener {
startActivity(Intent(Intent.ACTION_VIEW).apply {
data = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contact.contactId)
})
}
}
//endregion
companion object {
val TAG = this::class.qualifiedName
const val TITLE_VIEW_TRANSITION = "transition_title_%s"
const val ARG_ANCHOR_X = "anchor_x"
const val ARG_ANCHOR_Y = "anchor_y"
const val ARG_BOOKENTRYTYPE = "bookentrytype"
const val ARG_CONTACT = "contact"
fun getInstance(anchorView: View, bookEntryType: Int, contact: BookEntry.Contact): BookEntryContactDialog {
return BookEntryContactDialog().apply {
val anchorLocation = IntArray(2)
anchorView.getLocationOnScreen(anchorLocation)
sharedElementEnterTransition = FrTrans()
sharedElementReturnTransition = FrTrans()
arguments = Bundle().apply {
putInt(ARG_ANCHOR_X, anchorLocation[0] - dpToPx(anchorView.context, 16.0f))
putInt(ARG_ANCHOR_Y, anchorLocation[1] - dpToPx(anchorView.context, 40.0f))
putInt(ARG_BOOKENTRYTYPE, bookEntryType)
putParcelable(ARG_CONTACT, contact)
}
}
}
private fun dpToPx(context: Context, valueInDp: Float): Int {
val metrics = context.resources.displayMetrics
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics).toInt()
}
}
}
И как я вызываю DialogFragment:
RemoteCheckableChip(activity, null, R.style.Widget_MaterialComponents_Chip_Filter).apply {
text = contact.name
isChecked = contact.hasPaid
setOnClickListener {
BookEntryContactDialog.getInstance(it, bookEntry.entryType, contact)
.show(activity.supportFragmentManager.beginTransaction()
.addSharedElement(it, BookEntryContactDialog.TITLE_VIEW_TRANSITION.format(contact.id)), BookEntryContactDialog.TAG)
}
}
Переход:
class FrTrans : TransitionSet() {
init {
ordering = ORDERING_TOGETHER
addTransition(ChangeBounds())
addTransition(ChangeTransform())
}
}
Переход ничего не делает.Я также попытался отменить ввод фрагмента анимации без успеха.Есть ли лучший способ добиться этого расширяемого чипа?