0

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の提案は私にとって非常に理にかなっているので、適切に実行しませんでしたか?

4

2 に答える 2

1

削除トランザクションがコミットされた後、追加を行う前にfragmentManager.executePendingTransactions()を呼び出してみましたか。これらはコミット時に実際には実行されないがキューに入れられるため、マネージャーによる実行でこれらが故障しているのではないかと思います。

于 2012-09-12T21:39:54.120 に答える
0

投稿者の(非常に高く評価されている)提案をすべて試した後、問題を解決するものは何もなかったようです。その結果、アプリのこのセクションを担当するコードを再設計して書き直しましたが、新しいレイアウト設計には問題がないようでした。具体的にはLinearLayout、フラグメントの親を持たず、代わりにGridLayoutを直接使用することで、問題が解決したようです。両方の方法が機能しない理由はまだわかりませんが、特に、レイアウトのレイヤーを1つ減らすことでパフォーマンスが向上するため、機能する方法を使用します。

于 2012-11-15T03:15:37.770 に答える