为什么当我快速切换片段时我的应用程序崩溃?

问题描述 投票:0回答:3

当我使用 navigationDrawer 更改片段时,我的应用程序有时会崩溃。 致命错误没有多大帮助,我该如何解决这个问题?谢谢

FATAL EXCEPTION: main
     Process: acr.acr_app, PID: 29425
   java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
   at android.view.ViewConfiguration.get(ViewConfiguration.java:359)
   at android.view.View.<init>(View.java:3656)
   at android.view.View.<init>(View.java:3751)
   at android.view.ViewGroup.<init>(ViewGroup.java:492)
   at android.widget.LinearLayout.<init>(LinearLayout.java:200)
   at android.widget.LinearLayout.<init>(LinearLayout.java:196)
   at android.widget.LinearLayout.<init>(LinearLayout.java:192)
   at android.widget.LinearLayout.<init>(LinearLayout.java:188)
   at android.widget.TableRow.<init>(TableRow.java:61)
   at acr.acr_app.MyFragment3$2.onChildAdded(MyFragment3.java:170)
   at com.google.android.gms.internal.zzaer.zza(Unknown Source)
   at com.google.android.gms.internal.zzagp.zzSu(Unknown Source)
   at com.google.android.gms.internal.zzags$1.run(Unknown Source)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)

Fragment3 第 170 行:onStart() 监听器

  tableRow = new TableRow(getContext());
  tableRow.setLayoutParams(new TableLayout.LayoutParams(
  TableLayout.LayoutParams.WRAP_CONTENT,
  TableLayout.LayoutParams.WRAP_CONTENT, 1.0f));
android runtime-error
3个回答
6
投票

此崩溃的原因是片段仍在执行代码,而它已经与您的 Activity 分离。

在您的情况下,当片段到达

getContext()
时,它已经切换到另一个片段。因为
getContext()
正在寻找 Activity(片段不再附加到该 Activity),因此会导致空指针异常。

尝试以下操作:

 if(isAdded()){
    tableRow = new TableRow(getContext());
    tableRow.setLayoutParams(new TableLayout.LayoutParams(
    TableLayout.LayoutParams.WRAP_CONTENT,
    TableLayout.LayoutParams.WRAP_CONTENT, 1.0f));
 }

0
投票

你的fragment的

fragmentManager
工作模式是什么?是
:replace
还是
showhide
?如果你快速切换它会崩溃,因为你的片段在附加到
FragmentActivity
时还没有完成初始化。尝试这样的事情:


0
投票

我遇到了同样的问题并解决了它。这是因为我到处都在使用

requireView()
requireContext()
。当我们尝试从一个片段快速移动到另一个片段时,由于
onViewCreated()
已完成一半,
requireView()
requireContext()
将无法获取视图或上下文,因此会抛出错误并且应用程序会崩溃。为了防止这种情况,请在开始时将视图和上下文保存在变量中并重用该变量。

示例:

private lateinit var myContext : Context

并在 onViewCreated() 中添加:

myContext = getContext()

然后重用该变量:

if(isAdded()){
tableRow = new TableRow(myContext);
tableRow.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.WRAP_CONTENT,
TableLayout.LayoutParams.WRAP_CONTENT, 1.0f));

}

© www.soinside.com 2019 - 2024. All rights reserved.