与共享元素转换重叠状态和操作栏的元素



我正在使用以下代码定义共享元素转换:

Intent myIntent = new Intent(getActivity(), DetailActivity.class);
            myIntent.putExtra("url", url);
            myIntent.putExtra("preview_url", preview_url);
            // Define the view that the animation will start from
            View viewStart = view.findViewById(R.id.grid_item_image);
            Pair<View, String> p4 = Pair.create(viewStart, "wallpaper_transition");

            ActivityOptionsCompat options =
                    ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),p4);
            ActivityCompat.startActivity(getActivity(), myIntent, options.toBundle());

它工作正常,但有时过渡元素会重叠操作栏和状态栏,所以我编辑了代码如下:

Intent myIntent = new Intent(getActivity(), DetailActivity.class);
            myIntent.putExtra("url", url);
            myIntent.putExtra("preview_url", preview_url);
            // Define the view that the animation will start from
            View viewStart = view.findViewById(R.id.grid_item_image);
            View decor = getActivity().getWindow().getDecorView();
            //these appear to be null
            View statusBar = decor.findViewById(android.R.id.statusBarBackground);
            View navBar = decor.findViewById(android.R.id.navigationBarBackground);
            View actionBar = decor.findViewById(R.id.action_bar_container);
            Pair<View, String> p1 = Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME);
            Pair<View, String> p2 = Pair.create(navBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME);
            Pair<View, String> p3 = Pair.create(actionBar, "actionbar");
            Pair<View, String> p4 = Pair.create(viewStart, "wallpaper_transition");

            ActivityOptionsCompat options =
                    ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
                            p1,
                            p2,
                            p3,
                            p4);
            ActivityCompat.startActivity(getActivity(), myIntent, options.toBundle());

但是现在我崩溃了,因为statusBaractionBarnavBar null

java.lang.IllegalArgumentException: Shared element must not be null
                                                                   at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:561)
                                                                   at android.support.v4.app.ActivityOptionsCompat23.makeSceneTransitionAnimation(ActivityOptionsCompat23.java:71)
                                                                   at android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAnimation(ActivityOptionsCompat.java:263)
                                                                   at com.dcs.wallhouse.ListFragment$WallHolder.onClick(ListFragment.java:185)
                                                                   at android.view.View.performClick(View.java:5198)
                                                                   at android.view.View$PerformClick.run(View.java:21147)
                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                   at android.os.Looper.loop(Looper.java:148)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

请尝试直接获取这些视图,例如:

  View statusBar = getActivity().findViewById(android.R.id.statusBarBackground);
  View navigationBar = getActivity().findViewById(android.R.id.navigationBarBackground);

最新更新