39

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

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

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

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

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

4

4 に答える 4

83

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

((ViewGroup)getView().getParent()).getId();
于 2011-10-05T20:58:41.583 に答える
14

あなたの質問を正確に理解しているかどうかはわかりませんが、onCreateView でコンテナを取得します。ローカル変数に格納できると思います。

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}
于 2011-08-03T12:01:40.173 に答える
8

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

((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 レイアウト リソースがあることを前提としており、ID R.id.content_view を持つ FrameLayout がある XML リソース R.layout.activity_main を呼び出します。これが私が取ったアプローチです。ここで紹介する例は、実際にアプリで書いたものよりも単純なバージョンです。

ちなみに、IntelliJ の私のバージョン (バージョン 1.0.1) では、次のように警告されます。

((ViewGroup) getView().getParent)

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

于 2015-04-14T05:17:11.650 に答える
5

mCurrentFragmentActivity クラスにFragment インスタンスがあるとします。Fragment のコンテナ ビューは次の方法で取得できます。

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
于 2014-01-07T20:39:38.933 に答える