![](/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.