【问题标题】:Fragment transaction (replace) freezes the UI片段事务(替换)冻结 UI
【发布时间】:2017-01-02 19:56:27
【问题描述】:

我有一个片段,在它的布局中我有一个用于两个视图的区域。一种是用于列表视图。另一个用于地图视图。

列表视图只是一个列表视图。 地图视图是我在单击按钮后提交的片段。 因此,当我第一次按下该按钮时,它需要大约 2-3 秒才能替换专用视图中的片段。在这个时候,所有的 UI 都只是卡住了。 之后,list 到 map 之间的转换是平滑的。

如何克服?

布局的布局:

<RelativeLayout  

        ....

        <RelativeLayout
            android:id="@+id/mapViewLayout"
            android:layout_below="@id/restaurantListFragTxtNoResults"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="visible">

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/listViewLayout"
            android:layout_below="@id/restaurantListFragTxtNoResults"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ListView
                android:id="@+id/listView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:divider="@color/app_theme_color"
                android:dividerHeight="4px">
            </ListView>

             ...

        </RelativeLayout>   

     ...

</RelativeLayout>   

点击按钮切换到地图视图:

  mFragmentManager.beginTransaction()
                            .replace( R.id.mapViewLayout,
                                    new MapFragment() ).commit();
layoutView.findViewById(R.id.restViewLayout).setVisibility(View.GONE);

【问题讨论】:

    标签: android user-interface replace transactions fragment


    【解决方案1】:

    尝试使用处理程序包装片段事务。

    new Handler().postDelayed(new Runnable() {
               @Override
               public void run() {
                 mFragmentManager.beginTransaction()
                             .replace(R.id.mapViewLayout,
                                     new MapFragment()).commit();
               }
           }, 50);
    

    【讨论】:

    • 看看它是否有助于将延迟增加 50 到 100 或 200。
    • 不幸的是它也没有帮助..它现在只是在 X 轴上移动了更多(因为我有一个向左滑动的动画),然后它再次被冻结
    • x 轴上的移动比以前更平滑意味着延迟实际上正在增加。你会通过将延迟增加到 1000 或 1500 来尝试一下吗?
    • 但冻结并没有被阻止,它只是稍后发生..这对用户没有帮助
    • 再想一想,由于您在应用程序中加入了谷歌地图,谷歌播放服务很可能在第一次午餐时需要一些时间来初始化。有一个 hack 可以防止延迟生效:stackoverflow.com/a/28133951/2709580
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多