Java android.content.res.Resources$NotFoundException:找不到资源ID

Java android.content.res.Resources$NotFoundException:找不到资源ID,java,android,android-fragments,android-recyclerview,Java,Android,Android Fragments,Android Recyclerview,在我的回收视图中,我需要将项目的一部分替换为片段。 我一直在跟随,我能够实现我想要的 一切正常,但我面临一个严重问题,即我正在获取Resources$NotFoundException无法仅在我的RecyclerView的最后一项中找到资源ID,请注意,此问题仅发生在最后一项中,其他人工作正常 我尝试过的步骤: 我试图在R.java文件中查找资源ID,但都没有成功 我尝试过减少和增加RecyclerView中的项目数量,但问题仍然是一样的 搜索了其他相关的答案,比如在传递替换片段时为父布局分配相

在我的回收视图中,我需要将项目的一部分替换为片段。 我一直在跟随,我能够实现我想要的

一切正常,但我面临一个严重问题,即我正在获取
Resources$NotFoundException无法仅在我的RecyclerView的最后一项中找到资源ID
,请注意,此问题仅发生在最后一项中,其他人工作正常

我尝试过的步骤:

  • 我试图在R.java文件中查找
    资源ID
    ,但都没有成功

  • 我尝试过减少和增加RecyclerView中的项目数量,但问题仍然是一样的

  • 搜索了其他相关的答案,比如在传递替换片段时为父布局分配相同的id
  • 尝试捕获异常,但失败,因为我认为只有在最后一项的情况下,才能在创建时找到布局文件
  • 检查是否由于任何类型转换错误而发生
  • 请给出我哪里做错了的建议。我很乐意提供任何其他相关细节

    在发布了5天的问题后()我无法解决这个问题。 我制作了一个执行此特定任务的小样本应用程序,您可以

    请帮我解决这个问题

    编辑:过帐代码:

    private void flipcard(final RecyclerView.ViewHolder holder)
    {
        final MyHolder myHolderflipcard= (MyHolder) holder;
                // Delete old fragment
                int containerId = myHolderflipcard.container.getId();// Get container id
                Fragment oldFragment = ((FragmentActivity) context).getFragmentManager().findFragmentById(containerId);
                if(oldFragment != null)
                {
                    ((FragmentActivity) context).getFragmentManager().beginTransaction().remove(oldFragment).commit();
                }
                int newContainerId = getUniqueId();
                // Set the new Id to our know fragment container
                myHolderflipcard.container.setId(newContainerId);
                // Just for Testing we are going to create a new fragment according
                // if the view position is pair one fragment type is created, if not
                // a different one is used.
                {
                    Fragment f;
                    f = new CardBackFragment();
                    // Then just replace the recycler view fragment as usually
                    ((FragmentActivity) context).getFragmentManager().beginTransaction()
                            .setCustomAnimations(
                                    R.animator.card_flip_right_in,
                                    R.animator.card_flip_right_out,
                                    R.animator.card_flip_left_in,
                                    R.animator.card_flip_left_out)
                            .addToBackStack(null)
                            .replace(newContainerId, f).commit();
    
                    myHolderflipcard.cardView.setVisibility(View.GONE);
                }
    }
    // Method that could us an unique id
    private int getUniqueId(){
        return (int)
                SystemClock.currentThreadTimeMillis();
    }
    
    这是我的日志,如果有用的话

    E/UncaughtException: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1678
                                                                                  at android.content.res.Resources.getResourceName(Resources.java:2209)
                                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
                                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                                  at android.app.BackStackRecord.run(BackStackRecord.java:834)
                                                                                  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
                                                                                  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
                                                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                  at android.os.Looper.loop(Looper.java:135)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
    
    E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: **app package name //intentionally written**, PID: 3136
                                                                           android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1678
                                                                               at android.content.res.Resources.getResourceName(Resources.java:2209)
                                                                               at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
                                                                               at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                               at android.app.BackStackRecord.run(BackStackRecord.java:834)
                                                                               at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
                                                                               at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:135)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
    

    这个问题很有趣。调试示例应用程序一段时间后,这是我的发现:

    • 缺少的
      资源id
      是已创建片段的id-
      cardbackpartment
    • 替换并提交片段后,
      资源id
      将动态提供
    对于我刚才所说的,这里是我调试应用程序时的屏幕截图,请注意显示的id: 这是调试器告诉它丢失的缺少的id:

    需要说明的是,
    newContainerId
    被翻译成了十六进制id(很抱歉我的英语不好)

    那么这里发生了什么

    答案在于代码执行行的方式:
    myHolderflipcard.cardView.setVisibility(View.GONE)
    这是在提交要显示的片段后触发的

    以下是发生的情况: 当您告诉卡片视图消失时,最后一个项目将从ui中删除->因为它已从ui中删除,并且是回收器视图->上的最后一个项目,
    回收器视图的高度将缩短,以最小化
    视图
    。错误发生在最后一个项目上,因为
    回收器视图
    了解到保存问题的
    行布局
    为空,并且是最后一个项目->最后一个项目被转移到上面的问题行。同时,将
    片段
    插入
    框架布局
    的线程未完成。因此,当它完成并试图找到
    集装箱ID
    时,它无法找到它。因此,崩溃

    因此,解决问题的方法是等待框架完全添加,然后删除问题

    以下是修复方法:

    • 移除
      myHolderflipcard.cardView.setVisibility(View.GONE)您的
      flipcard
      方法中的行

    • 在外部创建:
      private MyHolder curHolder

    • 创建runnable以隐藏CardView:

      private Handler handler = new Handler();
      
      private Runnable runnable = new Runnable() {
          @Override
          public void run() {
             Log.d("mId", String.valueOf(curHolder.container.getId()));
              curHolder.cardView.setVisibility(View.GONE);
      
      //handler.postDelayed(这个,500); } };

    • 提交完成后发布:

              Fragment f;
              f = new CardBackFragment();
              // Then just replace the recycler view fragment as usually
              ((FragmentActivity) context).getFragmentManager().beginTransaction()
                      .setCustomAnimations(
                              R.animator.card_flip_right_in,
                              R.animator.card_flip_right_out,
                              R.animator.card_flip_left_in,
                              R.animator.card_flip_left_out)
                      .addToBackStack(null)
                      .replace(newContainerId, f).commit();
              // Once all fragment replacement is done we can show the hidden container
              handler.post(runnable);
      
    虽然它发生得很快。您可以使用
    handler.postDelayed(runnable,100)

    这是完整的代码(因为我英语很差,所以我把它贴出来以防万一)


    只需检查一些小问题。
    这可能不是原因,但通常情况下,在文本视图上设置文本时,会出现整数(number)。
    像吼叫

    int a = 999;    
    myTextView.setText(a);`
    

    因此,我假设您使用setText调用,并在cardbopfragment

    中添加代码片段。您正在尝试访问那些不在xm中或在其他xmll中定义的id。检查一下。@ADM:back fragment的代码或从哪里调用该片段?我怎么知道。添加正在崩溃的整个代码块。调试并找出..@HemantParmar我已经交叉检查了我调用的所有is,以及我在其中设置的资源类型,即在文本视图和所有其他视图中设置它们之前将其键入字符串,但需要注意的是,它仅在rc视图的最后一项中失败。非常感谢兄弟耐心地解决了我的问题逻辑地理解它。我将永远非常感谢你。嗯,我想保持联系。如果你也对它感兴趣,请告诉我。谢谢你的盛情款待,但我只是碰巧找到了解决办法。所以你不必那么做^^请检查我的第五点。我已经检查过任何打字错误。VũThánh T–m的解决方案解决了我的问题。
    int a = 999;    
    myTextView.setText(a);`