0

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

4

2 回答 2

1

您是否在提交删除事务后尝试在添加之前调用 fragmentManager.executePendingTransactions()。我想知道这些是否在经理执行过程中出现故障,因为它们在提交时并没有真正执行,而是放在队列中。

于 2012-09-12T21:39:54.120 回答
0

在尝试了发布者的所有(非常感谢)建议之后,似乎没有任何解决问题的方法。结果,我重新设计并重写了负责我的应用程序这一部分的代码,新的布局设计似乎没有问题。具体来说,没有LinearLayout片段的父母,而是直接使用 GridLayout 似乎可以解决问题。我仍然看不出这两种方法都行不通的任何原因,但我会选择可行的方法,尤其是因为少一层布局无论如何都会带来不错的性能提升。

于 2012-11-15T03:15:37.770 回答