5

私はAndroidアプリをAPI15と最小8に向けています。そこで、フラグメントを管理するためにサポートライブラリを使用します。アプリのいくつかの部分で使用するフラグメントのセットがあります。

さて、アクティビティでは、レイアウトにListViewがあります。

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/listOfEvents"
    android:layout_width="match_parent" android:layout_height="match_parent">
</ListView>

ListViewヘッダーに私のフラグメントを追加したいと思います。私はこれを試しました:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.event_open);

    listOfEvents = (ListView) findViewById(R.id.listOfEvents);

            Fragment fragment = new SortingStandardFragment();
            getSupportFragmentManager()
              .beginTransaction()
                  .add(fragment, null)
              .commit();

            View fragmentView = fragment.getView(); // problem: fragment is null!
            listOfEvents.addHeaderView(fragmentView);
    }

しかし、fragment.getView()がnullを返すためエラーが発生します(APIリファレンスドキュメントには、Add呼び出しにGroupView Idを配置する必要があると記載されていますが、GroupViewをレイアウトのどこに配置する必要がありますか?マークを打つ別の方法はありますか? ?

4

3 に答える 3

14

リストヘッダーに必要なフラグメントだけを含む新しいレイアウトを作成することで、これを解決しました。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/myFragmentEmbedded"
        android:name=".SortingStandardFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

およびアクティビティコード:

LayoutInflater inflater = getLayoutInflater();
header = inflater.inflate(R.layout.myLayout, null);
listOfEvents.addHeaderView(header);

SortingStandardFragmenttitleFragment = (SortingStandardFragment) 
     getSupportFragmentManager()
          .findFragmentById(R.id.myFragmentEmbedded);
于 2012-09-30T21:22:11.980 に答える
4

さらに別のxmlファイルに頼る必要のないバージョンが欲しかったので、ここに行きます:

Fragment fragment = ...
FrameLayout v = new FrameLayout(getActivity());
v.setId(42);
listView.addHeaderView(v, null, false);
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.beginTransaction().add(v.getId(), fragment).commit();
于 2014-02-05T20:10:56.903 に答える
1

誰かが彼の最初の試みが失敗した理由に興味がある場合:

  • ライフサイクルイベントはUIスレッドに投稿されます
  • Fragment.onCreateViewライフサイクルイベントです
  • Activity.onCreateライフサイクルイベントです
  • .getView()で作成されたビューを返しますFragment.onCreateView
  • commitライフサイクルイベントを投稿する

結論:の結果は、返さcommitれた後の次のループから確認できます。onCreate

ドキュメントを読んだ後、強制的commitにすぐに実行することを試みることができます。getSupportFragmentManager().executePendingTransactions()

于 2014-11-13T16:40:11.280 に答える