gpt4 book ai didi

java - 安卓.content.res.Resources$NotFoundException : Unable to find resource ID

转载 作者:行者123 更新时间:2023-11-29 06:51:02 27 4
gpt4 key购买 nike

在我的 RecyclerView 中,我需要将我的部分项目替换为我的 fragment 。我关注了this answer by Victor Cruz我能够实现我想要的。

一切正常,但我面临一个严重的问题,即我仅在我的 RecyclerView 的最后一项中收到 Resources$NotFoundException Unable to find resource ID,请注意,此问题仅发生在最后一项休息其他人工作正常。

我尝试过的步骤:

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

  2. 我已经尝试减少和增加 RecyclerView 中的项目数量,但问题仍然存在。

  3. 搜索了其他相关答案,例如将相同的 id 分配给父布局作为传递替换 fragment 。
  4. try catch 异常但失败了,因为我认为它无法在创建时仅在最后一项的情况下找到布局文件。
  5. 检查它是否由于任何类型转换错误而发生。

请给我建议我哪里做错了。我很乐意提供任何其他相关详细信息。

问题发布 5 天后(并为此苦苦挣扎了一个星期),我无法解决问题。我制作了一个执行此特定任务的小示例应用程序,您可以 download the code from here.

请帮我解决这个问题。

编辑:发布代码:

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)

最佳答案

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

  • 缺少的资源id是创建 fragment 的id -CardBackFragment
  • 资源 id 是在您替换并提交 fragment 后动态给出的

为了证明我刚才所说的,这是我调试您的应用时的屏幕截图,请注意显示的 id: enter image description here这是调试器告诉它丢失的丢失 ID: enter image description here

需要说明的是,newContainerId 被翻译成 hex id 就在这里(抱歉我的英语不好)

那么这里发生了什么?

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

事情是这样的:当你告诉卡片 View 消失时,最后一项从 ui 中移除 -> 因为它从 ui 中移除并且它是回收 View 中的最后一项 -> recycler view 的高度缩短以最小化 view。该错误发生在最后一项,因为 recycler view 理解持有问题的 row layout 是空的,它是最后一项 -> 最后一项是 transfer到上面的问题行。同时,将 fragment 插入您的 framelayout 的线程还没有完成。因此,当它完成并尝试查找 containerid 时,却找不到。因此,崩溃。

所以解决它的方法是等待框架完全添加然后您删除问题

这里是修复:

  • flipcard 方法中移除 myHolderflipcard.cardView.setVisibility(View.GONE);

  • 在外面创建一个: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(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);

虽然它发生得非常快。如果您想确保 fragment 在任何情况下都能成功替换,您可以使用 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);
}
};

关于java - 安卓.content.res.Resources$NotFoundException : Unable to find resource ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com