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
,请注意,此问题仅发生在最后一项中,其他人工作正常
我尝试过的步骤:
资源ID
,但都没有成功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
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)如果要确保在任何情况下都能成功替换片段,请改为code>
这是完整的代码(因为我英语很差,所以我把它贴出来以防万一)
只需检查一些小问题。
这可能不是原因,但通常情况下,在文本视图上设置文本时,会出现整数(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);`