簡體   English   中英

android.content.res.Resources $ NotFoundException:無法找到資源ID

[英]android.content.res.Resources$NotFoundException: Unable to find resource ID

在我的RecyclerView中,我需要將部分物品替換​​為片段。 我遵循了維克多·克魯茲(Victor Cruz)的回答,能夠實現我想要的。

一切工作正常,但是我面臨一個嚴重的問題,即我正在獲取Resources$NotFoundException Unable to find resource ID僅在我的RecyclerView的最后一項中Resources$NotFoundException Unable to find resource ID ,請注意,此問題僅在最后一項中發生,其他情況都很好。

我嘗試過的步驟:

  1. 我試圖在R.java文件中查找resource ID ,但徒勞無功。

  2. 我嘗試減少和增加RecyclerView中的項目數量,但問題仍然相同。

  3. 搜索了其他相關的答案,例如為傳遞父片段分配相同的ID給父級布局。
  4. 嘗試捕獲異常,但失敗了,因為我認為僅在最后一項的情況下,它無法在create上找到布局文件。
  5. 檢查是否由於任何類型轉換錯誤而發生。

請提出建議,我在哪里做錯了。 我很樂意提供其他相關細節。

發布問題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();
}

如果可以用的話,這是我的logcat。

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)

這個問題很有趣。 在調試示例應用程序一段時間后,這是我的發現:

  • 缺少的resource id是創建的片段的ID- CardBackFragment
  • 替換並提交片段后,將動態給定resource id

為了證明我剛才所說的,這里是我調試您的應用程序時的屏幕截圖,請注意顯示的ID 在此處輸入圖片說明 這是調試器告訴它丟失的丟失的ID: 在此處輸入圖片說明

需要明確的是, newContainerId翻譯為此處的十六進制ID (對不起,我的英語不好)

那么這里發生了什么?

答案在於代碼執行該行的方式: myHolderflipcard.cardView.setVisibility(View.GONE); 提交要顯示的片段后,該觸發器被觸發。

這里是什么情況:當你告訴卡片視圖中消失了,最后一個項目是從用戶界面中刪除- >因為它是從用戶界面中刪除,這是對回收視圖中的最后一個項目- >的高度recycler view是縮短使view最小化。 該錯誤發生在最后一個項目上,因為recycler view了解到容納該問題的row layout為空,並且它是最后一個項目->最后一個項目被轉移到上面的問題行。 同時,未將fragment插入framelayout的線程。 因此,當它完成並嘗試找到containerid ,它找不到它。 因此,崩潰。

因此,解決問題的方法是等待框架完全添加, 然后刪除問題

解決方法是:

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

  • 在外部創建一個: private MyHolder curHolder;

  • 創建一個可運行的以隱藏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(this,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); 相反,如果您想確保在任何情況下都能成功替換該片段

這是完整的代碼(因為我的英語真的很不好,所以我以防萬一)

    private void flipcard(final RecyclerView.ViewHolder holder)
    {
        final MyHolder myHolderflipcard= (MyHolder) holder;

        String nim=mysr_id.get(Integer.parseInt(mpref.getradio_button_value()));
        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher(nim);
        if (matcher.find())
        {
            currentsrid=Integer.parseInt(matcher.group(0));

            if (currentsrid!=flag)
            {
                flag = Integer.parseInt(matcher.group(0));
                // 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 = 0;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    newContainerId = View.generateViewId();
                }

                // Set the new Id to our know fragment container

                myHolderflipcard.container.setId(newContainerId);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    curHolder = myHolderflipcard;
                }


                // 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();
                    // Once all fragment replacement is done we can show the hidden container
                    handler.post(runnable);

                    //myHolderflipcard.container.setVisibility(View.VISIBLE);
                    //myHolderflipcard.radioGroup.setVisibility(View.GONE);
                    //myHolderflipcard.tvQuestion.setVisibility(View.GONE);
//                    myHolderflipcard.cardView.setVisibility(View.GONE);
                }

            }else
            {
               // backtoorignal=false;
                // ((FragmentActivity)context). getFragmentManager().popBackStack();
            }

        }

    }

    private MyHolder curHolder;
    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);
        }
    };

只是檢查小東西。
它可能不是原因,但通常在具有Integer(number)的Textview上使用setText時會發生。
像波紋管

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

所以我假設您使用SetText調用CardBackFragment內的數字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM