Morph Chip для DialogFragment в Android - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу отобразить меню (например, 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())
    }
}

Переход ничего не делает.Я также попытался отменить ввод фрагмента анимации без успеха.Есть ли лучший способ добиться этого расширяемого чипа?

...