2012-09-12 23 views
0

我有一些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的建议对我来说很重要,所以我没有正确执行它?

+0

您是否尝试过使用'View.post(Runnable接口)'的交易? **编辑**:Sory不完全清楚。我的意思是在可运行中包装第二个事务。我有一个不同但相似的问题,这种问题解决了我的问题。 – guest

+0

今天早上我试过这个,无济于事。我怀疑这没有什么区别,因为执行重绘的代码已经在UI线程中。不过,我正在编辑我的问题,以显示此代码以及任何潜在的输入。 – Jared

+0

尝试在包含这些片段的LinearLayout上调用invalidate()。 –

回答

0

尝试所有的那些谁贴的(非常感谢)的建议后,似乎没有什么解决的问题。因此,我重新设计并重写了我的应用程序的这一部分的代码,新版面设计似乎没有问题。特别是,没有LinearLayout父母的碎片,而是直接使用GridLayout似乎可以解决问题。我仍然没有看到两种方法都无法正常工作的原因,但是我会继续采用一些有效的方法,特别是因为减少一层布局是不错的性能提升。

1

您是否尝试删除事务被提交后,调用fragmentManager.executePendingTransactions()你做加法之前。我想知道是否这些在经理执行中失序,因为他们在提交时没有真正执行,而是放在队列中。

+0

我很害怕没有这样的运气。我在第一次提交调用之后直接添加了您的建议。日志输出或屏幕中没有任何更改。 – Jared

+0

我检查了'executePendingTransactons()'的返回值,它报告它确实强制事务发生,但如果我同时执行删除和添加,它仍然不会显示。 – Jared

+0

这可能是一个愚蠢的问题,但在删除行中,你的意思是让String.value(i)而不是String.value(oldFragment)? – Wizetux