1

すべてのアクティビティで参照される SlidingDrawer があります。ドロワーは非常に詳細で、ビューの深い階層があります。現在、作成時にすべてのアクティビティでアプリケーション コンテキストを呼び出して、ドロワーのシングルトン コピーを受け取ります。アクティビティ onPause が呼び出されると、最上位の ViewGroup からドロワーが削除されます。これは機能しますが、それが最善の方法であるかどうかはわかりません。

また、私が抱えている問題は、コンテキストの使用です。SlidingDrawer には、いくつかのダイアログを起動するいくつかのボタンがあります。アプリケーション コンテキストを渡すことができないことを知っていたので、ドロワーの参照コンテキストを変更したOnActivityChangeBroadcasterandを作成しました。Listenerただし、これでもダイアログは常にランチャー アクティビティに表示されます。

誰かがこの問題について何か考えや知恵を持っていますか?

4

2 に答える 2

4

これは機能しますが、それが最善の方法かどうかはわかりません。

メモリリークが発生しています。アクティビティ間でウィジェットを渡さないでください。アクティビティが破棄されたときにその参照を削除する場合を除いて、ウィジェットやアクティビティへの参照を含むその他のものをApplicationオブジェクトまたは静的データメンバーに配置しないでください。null

誰かがその問題について何か考えや知恵を持っていますか?

各アクティビティで引き出しを再作成してください。

于 2011-05-05T16:44:15.797 に答える
1

私のアプローチは、UI をデータから分離することです。多くのアクティビティが同じ SlidingDrawer を使用している場合、SlidingDrawer が表示しているデータを独自の [非 UI] クラスに分離して、1 つの場所にのみ存在するようにし、各 SlidingDrawer インスタンスにそのデータからデータを入力します。XML で SlidingDrawer を一度定義すると、<include>必要なすべてのレイアウトで定義できます。

次に、SlidingDrawer に別のクラスのデータを設定する関数が 1 つあります (シングルトン オブジェクトを介して、または data を作成することによってアクセスできますstatic)。これを実現するにstaticは、SlidingDrawer をパラメーターとして入力するメソッドを作成するか ( public static void loadSlidingDrawer(SlidingDrawer destinationView) {...})、SlidingDrawer を拡張して、そのクラス メソッドを各インスタンスからアクセスできるようにすることができます。

CommonsWare は正しいです。現在の戦略では、いたるところでメモリ リークが発生します。UI 要素は、常に破棄して再作成できる柔軟性を備えている必要があるため、すべてのデータを非 UI クラスに分離し、UI が単にアクセスして表示することは非常に良い習慣です。これにより、すべてがうまく分離され、フレームワークが効率的に機能できるようになります。

于 2011-05-05T16:53:50.987 に答える