2011-08-03 3 views
25

を取得し、私はフラグメントがフラグメントのコンテナビューID

transaction.add(R.id.content, fragment, null); 

を使用して追加されていて、私はこの1から新しいフラグメントを開始する必要があります。しかし、これを行うには、最初のフラグメントのコンテナビューID(私の場合はR.id.content)を知る必要があります。どのように私はこれを得ることができますか?

私はこのIDを直接使用することができますが、フラグメントは親アクティビティーに関するこの種の詳細を知ってはいけないと思います。たとえば、このフラグメントを別のアクティビティで使用することは不可能です。

「開始」フラグメントが別のフラグメントから始まっている可能性がありますが、すべてのフラグメント処理ロジックはアクティビティ自体で処理する必要がありますか?しかし、フラグメントの素敵なシーケンスを作成することは非常に便利です(例えば、detalView-> moreDetailView-> evenMoreDetailView)。

答えて

65

あなたはActivityクラスにフラグメントインスタンスmCurrentFragmentを持っていると仮定すると

((ViewGroup)getView().getParent()).getId(); 
+3

それは私にnullのアイデアを与える、私は、LinearLayout x =(LinearLayout)((ViewGroup)getView()と言うとき、断片として親として使用するレイアウトを含むメイン画面を持っています。getParent());フラグメントクラスで呼び出されますが、常にnullです – AMH

+0

時間の節約のために魅力のように働きます –

11

私はあなたの質問を正確に理解していますが、コンテナはonCreateViewにあります。あなたはそれをローカル変数に隠すことができると思います。

public View onCreateView(LayoutInflater inflater, 
    ViewGroup container, 
    Bundle savedInstanceState) { 
    mContainer = container; 
    ... 
} 
+0

あなたは正しいことを理解しています。私はこのようにすることができますが、それは私のハックのように思えます。ここのコンテナは、そのビューを膨らませるためにフラグメントに渡され、将来の使用のために格納されるはずです。コンテナビューのIDを取得するネイティブな方法がありますか? –

+1

この方法で何が問題なのか分かりません。ビューを保存しない場合は、単にIDを保存してください。 –

5

を呼び出すことにより、コンテナのIDにアクセスすることができます。 あなたは私がビューにアクセスするのではなく、私はあなたが提示MainActivityで作業していることを前提としています

((ViewGroup) getView().getParent()).getId() 

を使用して、より標準的な方法があると思う

int id = mCurrentFragment.getView().getParent().getId(); 
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View 
+1

(私があなたがしていることを正しく理解している場合)**からIDを取得したオブジェクトは**あなたが探しているオブジェクトですために。 'ViewGroup vg =(ViewGroup)mCurrentFragment.getView()。getParent();'これはあなたがしたことと同じではない状況ですか? – ToolmakerSteve

+0

うん@ToolmakerSteve、彼らは常に同等です。それを私に見せてくれてありがとう。 –

8

を経由してフラグメントのコンテナビューを取得することができますリストフラグメントは、アイテムをクリックすると別のリストフラグメントを提示することができます。 MainActivityのメインビューをあなたが提示しているリストフラグメントの内容に置き換えることを選択したと仮定しています。

MainActivityで各リストフラグメントがホストされているため、常にMainActivityのビューにアクセスできます。

// Inside of onListItemClick... 
FragmentManager fm = getFragmentManager(); 
Fragment fragment = new MyOtherListFragment(); 

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view); 

fm.beginTransaction() 
     .replace(contentView.getId(), fragment) 
     .addToBackStack(null) 
     .commit(); 

上記の例は、あなたがMainActivityで設定したXMLレイアウトリソースを持っていると仮定し、XMLリソースID R.id.content_viewとでframeLayoutありR.layout.activity_main、呼び出します。これが私が取ったアプローチです。私がここに示した例は、実際に私のアプリに書いたものより単純なバージョンです。

ところで、のIntelliJの私のバージョン(バージョン1.0.1)は

((ViewGroup) getView().getParent) 

は、NullPointerExceptionがスローされる可能性が私に警告します。

+1

さて、この質問の数週間後、私は、フラグメントデザインが使い勝手の点を超えて欠陥があり、フラグメントを再び使用したことがないことを理解しました。 –

関連する問題