小编Bru*_*ira的帖子

将 ComposeView 添加到 PopupWindow 的 contentView 崩溃

我试图PopupWindow从 a显示 a Fragment,然后将 a 添加ComposableView到 Popup contentView,但它崩溃了,因为ViewTreeLifecycleOwner找不到PopupDecorView$PopupDecorView

我尝试过的事情:

  • 使用PopupWindowCompat显示弹出窗口。
  • Fragment(1.3.4 和 1.4.0-alpha1)的多个库版本。
  • Activity我使用的版本是:1.3.0-alpha08。
  • contentView手动设置和的生命周期所有者ComposeView

来电:

添加:ComposeViewcontentView

 contentWindow.contentView.addView(
                AdaptiveCardistRender.adaptiveCardistResponseView(
                    contentWindow.contentView.context,
                    response
                )
            )
Run Code Online (Sandbox Code Playgroud)

显示弹出窗口:

PopupWindowCompat.showAsDropDown(
                popupWindow,
                anchor,
                0,
                startVerticalOffset,
                Gravity.NO_GRAVITY
            )
Run Code Online (Sandbox Code Playgroud)

设置生命周期PopupWindow

class ExtensionsPopupWindow(
    val contentView: ScrollView,
    width: Int,
    height: Int,
    lifecycleOwner: LifecycleOwner,
    savedStateRegistryOwner: SavedStateRegistryOwner,
) : PopupWindow(contentView, width, height, true) {

    init {
        ViewTreeLifecycleOwner.set(contentView, lifecycleOwner)
        ViewTreeSavedStateRegistryOwner.set(contentView, savedStateRegistryOwner) …
Run Code Online (Sandbox Code Playgroud)

android popupwindow android-lifecycle android-popupwindow android-jetpack-compose

10
推荐指数
1
解决办法
1642
查看次数

片段转换支持25.1.0与Recyclerview

我正在使用片段转换来为回收器视图中的视图设置动画,使用25.0.1支持lib并且转换工作正常,可以推送并弹出目标片段.

我用来生成事务的代码是:

supportFragmentManager.beginTransaction()
    .replaceAddToBackStack(R.id.content, fragment)
    .addSharedElement(fragment, commonViews)
    .commit()
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试更新到25.1.0版本的支持库,并且pop动画正在崩溃,因为转换没有找到原始视图,并且崩溃了:

E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.support.v4.app.FragmentTransitionCompat21.setNameOverridesOptimized(FragmentTransitionCompat21.java:339)
at android.support.v4.app.FragmentTransition.configureTransitionsOptimized(FragmentTransition.java:232)
at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:111)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2143)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:822)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:775)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:178)
at App.ui.base.BaseActivity.onBackPressed(BaseActivity.kt:23)
...
Run Code Online (Sandbox Code Playgroud)

但是,如果我禁用"优化",它可以正常工作.

supportFragmentManager.beginTransaction()
    .replaceAddToBackStack(R.id.content, fragment)
    .addSharedElement(fragment, commonViews)
    .setAllowOptimization(false)
    .commit()
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

编辑:我用来包装共享元素的扩展:

.replaceAddToBackStack

fun<T : Fragment> FragmentTransaction.replaceAddToBackStack(containerView: Int, fragment: T, tag: String? = null) : FragmentTransaction {
  return replace(containerView, fragment, tag).addToBackStack(fragment.toString())
}
Run Code Online (Sandbox Code Playgroud)

.addSharedElement

fun<T: Fragment, V: View> FragmentTransaction
    .addSharedElement(destination: T?, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-support-library

9
推荐指数
1
解决办法
463
查看次数