为啥 Fragment 使用 .setCustomAnimations() 在 .hide() 上崩溃?
Posted
技术标签:
【中文标题】为啥 Fragment 使用 .setCustomAnimations() 在 .hide() 上崩溃?【英文标题】:Why Fragment crashes on .hide() with .setCustomAnimations()?为什么 Fragment 使用 .setCustomAnimations() 在 .hide() 上崩溃? 【发布时间】:2019-01-01 22:26:30 【问题描述】:xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<fragment
android:id="@+id/the_fragment"
android:name="com.example.MyFragment"
android:layout_
android:layout_
android:layout_alignParentBottom="true"
tools:layout="@layout/fragment_my"/>
<Button
android:id = "@+id/button"
android:layout_
android:layout_
android:text="Show/Hide"/>
</RelativeLayout>
代码:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
mMyFragment = (MyFragment) getChildFragmentManager()
.findFragmentById(R.id.the_fragment);
((Button)view.findViewById(R.id.button)).setOnClickListener(view->
if (...)
//hide
getChildFragmentManager().beginTransaction()
.setCustomAnimations(R.animator.slide_in_from_bottom, R.animator.slide_out_to_bottom)
.hide(mMyFragment)
.commit();
else
//show
getChildFragmentManager().beginTransaction()
.setCustomAnimations(R.animator.slide_in_from_bottom, R.animator.slide_out_to_bottom)//in this line the app crash
.show(mMyFragment)
.commit();
);
发生错误:
Process: by.gramophone.develop, PID: 21508
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.startViewTransition(android.view.View)' on a null object reference
at android.support.v4.app.FragmentManagerImpl.completeShowHideFragment(FragmentManager.java:1700)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1797)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:792)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
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)
更新:
但如果我删除 .setCustomAnimations(R.animator.slide_in_from_bottom, R.animator.slide_out_to_bottom)
则不会发生错误
【问题讨论】:
您是否将片段添加到片段管理器中? @SarthakGandhi 它只添加在 xml 中,怎么做? 试试这个***.com/questions/13911261/… @SarthakGandhi @NileshRathod 我这样做是在mMyFragment = (MyFragment) getChildFragmentManager() .findFragmentById(R.id.the_fragment);
你应该添加一个空检查。
【参考方案1】:
正如 developer.android.com 上所说“当您通过在布局 XML 文件中定义片段将片段添加到活动布局时,您无法在运行时删除片段。如果您打算将片段交换并在用户交互过程中,您必须在活动第一次启动时将片段添加到活动中......“link
尝试动态添加片段。 how to
【讨论】:
以上是关于为啥 Fragment 使用 .setCustomAnimations() 在 .hide() 上崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
为啥显示Fragment1之前会调用Fragment2的onCreateView
Android:何时/为啥我应该使用 FrameLayout 而不是 Fragment?
为啥android fragment 不调用 oncreateview方法
为啥popbackstack会调用fragment的onCreateView?