LinearLayouts
フラグメントを含めることを目的としたものがいくつかあります。互換性ライブラリのフラグメント、マネージャーなどを使用しています。コンテンツを再描画しようとすると、LinearLayouts
最初にすべてのフラグメントを削除してから、必要なものを追加します。常に期待どおりに機能するとは限らず、とにかくレイアウトに複数のフラグメントを追加する必要があることを理解しているため、replaceは使用しません。以下のコードは機能するはずですが、実行すると、元のフラグメントは消えますが、新しいフラグメントは表示されません。
関連するコードは次のとおりです。
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のドラッグアンドドロップコンポーネントに関連しています。テストはGalaxyNexus4.1デバイスで行われますが、コードの動作は私が試したすべてのデバイスで同じです。
更新3
削除トランザクションを削除し、追加トランザクションのみを実行すると、期待どおりの結果が得られるため、問題は2つのトランザクションを連続して実行することに関連しているようです。Wizetuxの提案は私にとって非常に理にかなっているので、適切に実行しませんでしたか?