web-dev-qa-db-ja.com

フラグメントのコンテナビューIDを取得します

を使用してフラグメントを追加しました

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

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

このIDを直接使用することはできますが、フラグメントは親アクティビティに関するこのような詳細を知らないはずです。たとえば、この場合、このフラグメントを別のアクティビティで使用することはできません。

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

32

を呼び出すことにより、コンテナのIDにアクセスできます

((ViewGroup)getView().getParent()).getId();
76
Behlül Uçar

あなたの質問を正確に理解していればダンノですが、onCreateViewでコンテナを取得します。ローカル変数に格納できると思います。

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

を使用するのではなく、ビューにアクセスするより標準的な方法があると思います

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

リストフラグメントを提示するMainActivityで作業していると仮定します。リストフラグメントは、アイテムをクリックするなどして別のリストフラグメントを提示できます。 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リソースR.layout.activity_mainを呼び出し、ID R.id.content_viewのFrameLayoutがあることを前提としています。これが私が取ったアプローチです。ここで紹介する例は、実際にアプリで作成したものよりも簡単なバージョンです。

ちなみに、私のバージョンのIntelliJ(バージョン1.0.1)は、

((ViewGroup) getView().getParent)

nullPointerExceptionをスローする場合があります。

ActivityクラスにFragmentインスタンスmCurrentFragmentがあると仮定します。を介してフラグメントのコンテナビューを取得できます。

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