我有一些LinearLayouts
旨在包含片段。我正在使用兼容性库片段、管理器等。当我尝试重绘内容时,LinearLayouts
我首先删除所有片段,然后添加需要的内容。我不使用替换,因为我的理解是它并不总是按预期工作,无论如何我需要将多个片段添加回布局中。据我所知,下面的代码应该可以工作,但是当它执行时,所发生的只是原始片段消失了,但新片段没有出现。
相关代码如下:
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(TAG, "ACTION_DRAG_ENTERED called on view: " + v + " with id: " + v.getId());
handleActionDragEntered(v, event);
break;
default:
break;
}
return true;
}
protected void handleActionDragEntered(View v, DragEvent event) {
ArrayList<Integer> oldRow;
switch (mState) {
case TARGET_NOT_ENTERED:
mState = State.TARGET_ENTERED_PARENT;
mParentOld = mParentNew = (LinearLayout) v; //Save the parent row
//Replace the drag view with a drop target. Need to lookup which row the parent row is.
oldRow = mAdapter.replaceDragViewWithTarget(mDragView.getId(),
mRowIndices.get(mParentOld.getId()));
redraw(mParentOld, oldRow, mAdapter.getIndiciesForRow(mRowIndices.get(mParentOld.getId())));
break;
case TARGET_ENTERED_PARENT:
mState = State.TARGET_ENTERED_NEW_PARENT;
mParentNew = (LinearLayout) v;
oldRow = mAdapter.addDragViewToRow(mDragView, mRowIndices.get(mParentNew.getId()), getIndexInRow(event.getX(), v));
redraw(mParentNew, oldRow, mAdapter.getIndiciesForRow(mRowIndices.get(mParentNew.getId())));
break;
default:
Log.w(TAG, "Unhandled Action Drag Entered!");
}
}
public void redraw(View v, ArrayList<Integer> oldRow, ArrayList<Integer> newRow) {
FragmentManager fragmentManager = mParentActivity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
for (int oldFragment : oldRow) {
Log.d(TAG, "Removing fragment " + oldFragment);
fragmentTransaction.remove(fragmentManager.findFragmentByTag(String.valueOf(oldFragment)));
}
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
fragmentTransaction = fragmentManager.beginTransaction();
//fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
for (int newFragment : newRow) {
Log.d(TAG, "Adding fragment " + newFragment + " to row: " + v.getId());
fragmentTransaction.add(v.getId(), mAdapter.getFragmentAtIndex(newFragment), String.valueOf(newFragment));
}
fragmentTransaction.commit();
}
LogCat 中没有任何错误指示,代码中的所有日志语句都按预期报告值,包括来自片段的回调,通知他们正在创建视图。
更新
调用invalidate()
视图容器并不能解决问题。
更新 2
根据来宾用户的建议,我尝试将重绘代码包装在Runnable
视图上。目前我的重绘代码在 UI 线程上执行,所以我认为这本身没有必要,但也许它会让我深入了解我的问题可能是什么。我还编辑了上面的代码片段以包含 Wizetux 的建议以及更多负责调用重绘函数的代码。这一切都与Android的拖放组件有关。测试是在 Galaxy Nexus 4.1 设备上进行的,但是我尝试过的所有设备上的代码行为都是相同的。
更新 3
如果我删除删除事务并只执行添加事务,结果如预期,所以问题似乎与连续执行两个事务有关。Wizetux 的建议对我来说很有意义,所以我没有正确执行它吗?