![](/img/trans.png)
[英]Weird android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f06008d
[英]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
,請注意,此問題僅在最后一項中發生,其他情況都很好。
我嘗試過的步驟:
我試圖在R.java文件中查找resource ID
,但徒勞無功。
我嘗試減少和增加RecyclerView中的項目數量,但問題仍然相同。
請提出建議,我在哪里做錯了。 我很樂意提供其他相關細節。
發布問題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.