这个问题很有趣。在调试示例应用程序一段时间后,我发现:
-
这个
resource id
缺少的是所创建片段的id-
CardBackFragment
.
-
这个
资源id
在替换和提交片段后动态提供
对于我刚才所说的教授,这里是我调试你的应用程序时的屏幕截图,请注意
身份证件
如图所示:
这是调试器告诉它丢失的缺少的id:
要明确的是
newContainerId
翻译为
十六进制id
就是这里(抱歉我的英语不好)
那么这里发生了什么?
答案在于代码执行行的方式:
myHolderflipcard.cardView.setVisibility(View.GONE);
这是在提交要显示的片段后触发的。
发生的情况如下:
当您告诉卡片视图消失时,最后一项将从ui中删除->因为它已从ui中删除,并且是回收器视图上的最后一项->的高度
recycler view
缩短以最小化
view
. 最后一项出现错误,因为
回收器视图
了解
row layout
保留问题的选项为空,并且是最后一项->最后一项改为转移到上面的问题行。同时,插入
fragment
进入您的
framelayout
未完成。所以当它完成后,它会试图找到
containerid
,它找不到它。因此,坠机。
所以解决这个问题的方法是
等待帧完全添加
然后
您删除了问题
以下是修复方法:
-
去除
我的持卡人信用卡。cardView。设置可见性(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);
//处理程序。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);
如果您想确保在任何情况下都能成功替换片段,请改为
这是完整的代码(因为我英语很差,所以我把它贴出来以防万一)
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));
int containerId = myHolderflipcard.container.getId();
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();
}
myHolderflipcard.container.setId(newContainerId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
curHolder = myHolderflipcard;
}
{
Fragment f;
f = new CardBackFragment();
((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();
handler.post(runnable);
}
}else
{
}
}
}
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);
}
};