我有一些LinearLayouts
其意在遏制片段后添加新片段的LinearLayout。我正在使用兼容性库片段,管理器等。当我试图重新绘制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的任何迹象他们的看法。
UPDATE
视图容器上调用invalidate()
不解决问题。
更新2
继来宾用户的建议,我想在这张贴在视图Runnable
包装重绘代码。目前我的重绘代码在UI线程上执行,所以我不认为这本身是必要的,但也许它会让我对一些问题有所了解。我还编辑了上面的代码片段,以包含Wizetux的建议以及包含更多负责调用重绘函数的代码。所有这些都与Android的拖放组件有关。测试是在Galaxy Nexus 4.1设备上进行的,但是,我尝试过的所有设备上的代码行为都是相同的。
更新3
如果我删除的删除交易,仅执行附加的交易,与预期一致的结果,所以这个问题似乎涉及到连续做两笔交易。 Wizetux的建议对我来说很重要,所以我没有正确执行它?
您是否尝试过使用'View.post(Runnable接口)'的交易? **编辑**:Sory不完全清楚。我的意思是在可运行中包装第二个事务。我有一个不同但相似的问题,这种问题解决了我的问题。 – guest
今天早上我试过这个,无济于事。我怀疑这没有什么区别,因为执行重绘的代码已经在UI线程中。不过,我正在编辑我的问题,以显示此代码以及任何潜在的输入。 – Jared
尝试在包含这些片段的LinearLayout上调用invalidate()。 –