2011-11-08 4 views
16

私はAndroid開発には新しく、私がしようとしていることを達成する方法を混乱させています。私はいくつかの読書や断片について学んだので、さまざまな画面サイズのデザイン間でレイアウトとコードを共有することができます。私はいくつかのフラグメントを作成し、それらを正常に使用しました。しかし、私は電話で通常のアクティビティでフラグメントを表示したいが、タブレットにPopupWindow(またはより良い選択肢があれば同様のもの)でそのフラグメントを表示したいという状況があります。PopupWindowでフラグメントを正しく作成する

ボタンをクリックすると、フラグメントを膨張させてPopupWindowに表示する方法を理解することができました。私のコードは次のようになります。

public void onClick(View v) { 
    LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false); 
    connectionListPopup = new PopupWindow(popupLayout, 300, 470, true); 
    connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0); 
} 

ポップアップが表示され、serverconnection_fragment.xmlに記述されているUIが表示されます。問題は、このように作成することで、FragmentクラスのServerConnectionFragment.javaがインスタンス化されることがないため、リスト内にUIがなく、ボタンのリスナーがないなどです。私は、Javaクラスをインスタンス化し、フラグメントを通常は膨張させ、イベントリスナーをアタッチし、そこで作成されたビューをPopupWindowコンストラクタに渡す方法があるようですが、どのように把握できません。誰か助けてくれますか?

私はAndroid 2.1のために、FragmentクラスのAndroid-support-v4.jarファイルを使用してこれを構築しています。

答えて

17

レイアウトを直接膨張させても、フラグメントをインスタンス化することはありません。 Androidは、フラグメントとアクティビティの両方が同じレイアウトファイルを参照しようとしていることを単なる偶然と考えています。

通常は、FragmentManager.add(int,Fragment)を使用して、レイアウトにフラグメントを追加します。ただし、指定するコンテナIDは現在のアクティビティのレイアウトの一部でなければなりません。これはPopupWindowではありません。代わりに、コンテナを指定せずにフラグメントマネージャーにフラグメントを追加し、フラグメントの後のある時点で(たとえばonStart())、PopupWindowを表示することができます。これは正確にはDialogFragmentがどのように動作するかであり、すでに多くのサポートがあるので、代わりにDialogFragmentを使用するように変更することをお勧めします。

フラグメントコードでは、単にフラグメントの代わりにDialogFragmentを拡張し、それを表示するにはDialogFragment.show(FragmentManager,String)を使用します。 onCreateメソッドでsetStyle(DialogFragment.STYLE_NO_FRAME, getTheme())を呼び出して、デフォルトの境界線を取り除くことができます。このフラグメントをレイアウトに追加することはできます(電話でポップアップとして表示したくない場合)。これは期待どおりに動作します。

+0

正解、ありがとう。また、PopupWindowでリストを表示していたときに、リストに指定したContextMenuを表示することを拒否しました。 DialogFragmentに切り替えれば、それを解決することができました。 –

+1

可能な場合、ポップアップウィンドウに最初の例として、最後の文章を説明したり、説明したりできますか? "この断片をレイアウトに追加することはできますか?ポップアップとして表示されます)、期待どおりに動作します。 – JPMagalhaes

+1

@JPMagalhaes、StrongはPopupWindowでフラグメントを使用しないでください。メモリリークの問題が発生する可能性があります。 – Jacky

関連する問題