16

まず、1.6(ドーナツ) に Android 互換性ライブラリ V4 rev.3 を使用しています。

最初に ListFragment を作成すると、setListAdabpter() を使用するまで不確定な進行状況インジケーターが表示されます。ListFragment.onCreateView のドキュメントによると、カスタム レイアウトを使用する場合:

このメソッドを独自のカスタム コンテンツでオーバーライドする場合は、レイアウト ファイルに標準レイアウト {@link android.R.layout#list_content} を含めることを検討してください。これにより、ListFragment のすべての標準動作を引き続き保持できます。特に、これは現在、組み込みの不確定な進行状況を表示する唯一の方法です。

問題は、レイアウトファイルに入って試してみると <include layout="@android:layout/list_content" ...>、(Eclipse)がそれを教えてくれることです

リソースは公開されていません。(値が「@android:layout/list_content」の「layout」で)。

list_content.xmlこれは、V4 ソース コードに存在しないことを意味します。ドキュメントによると、API v11に登場したため、これは正しいです。

互換性ライブラリのソースに存在すると思い込んでいたのですが、存在するかどうかはわかりません...

私が見ることができる他の唯一の解決策は、AndroidのAPI V11ソースコードを掘り下げてコピーして貼り付けることlist_content.xmlです. ただし、今のところ、このハッキングは避けたいと思います。これが唯一の解決策ですか?

4

3 に答える 3

9

互換性ライブラリに含まれている は、実際のListFragmentものとは異なり、そのレイアウト (list_content) を使用していないようです。これは、jar として提供され、リソースをパッケージ化できないことが原因である可能性があります。その内容は次のonCreateViewとおりです。

互換性ライブラリの ListFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final Context context = getActivity();

    FrameLayout root = new FrameLayout(context);

    // ------------------------------------------------------------------

    LinearLayout pframe = new LinearLayout(context);
    pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
    pframe.setOrientation(LinearLayout.VERTICAL);
    pframe.setVisibility(View.GONE);
    pframe.setGravity(Gravity.CENTER);

    ProgressBar progress = new ProgressBar(context, null,
            android.R.attr.progressBarStyleLarge);
    pframe.addView(progress, new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

    root.addView(pframe, new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

    // ------------------------------------------------------------------

    FrameLayout lframe = new FrameLayout(context);
    lframe.setId(INTERNAL_LIST_CONTAINER_ID);

    TextView tv = new TextView(getActivity());
    tv.setId(INTERNAL_EMPTY_ID);
    tv.setGravity(Gravity.CENTER);
    lframe.addView(tv, new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

    ListView lv = new ListView(getActivity());
    lv.setId(android.R.id.list);
    lv.setDrawSelectorOnTop(false);
    lframe.addView(lv, new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

    root.addView(lframe, new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

    // ------------------------------------------------------------------

    root.setLayoutParams(new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

    return root;
}

Android 4.0 の ListFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(com.android.internal.R.layout.list_content, container, false);
}

APIv11 ソースからレイアウト ファイルをコピーするか、このビューの初期化コードを含めるかを選択すると、どちらが「ハッカー」と見なされるかは明らかだと思います ;)

于 2012-03-16T21:38:12.303 に答える
2

サポート ライブラリを使用して list_content レイアウトを使用できないことに不満を感じました。私のアプローチは、ListFragment のデフォルトの onCreateView メソッドを再利用して、カスタム レイアウトの一部として追加するだけでした。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View listContent = super.onCreateView(inflater, container,
            savedInstanceState);

    View v = inflater.inflate(R.layout.my_custom_layout, container,
            false);

    FrameLayout listContainer = (FrameLayout) v.findViewById(R.id.my_list_container);

    listContainer.addView(listContent);

    return v;
}

ListView がカスタム レイアウトにあった場所に FrameLayout を追加しました。

于 2013-10-23T23:34:45.420 に答える
1

互換性ライブラリを使用するときにデフォルトの @android.R.layout/list_content をカスタム レイアウトに組み込むための回避策の 1 つは、ダミーの ListFragment を作成することです。

package com.example.app;

import android.support.v4.app.ListFragment;

public class ListContentFragment extends ListFragment {
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        //Supress default list and empty text behavior
        //super.onViewCreated(view, savedInstanceState);
    }
}

次に、このフラグメント (推奨される list_content レイアウトの代わりに) をカスタム レイアウトに含めます。

...
<fragment class="com.example.app.ListContentFragment"
    android:layout_weight   ="1" 
    android:layout_width    ="fill_parent"
    android:layout_height   ="0dip" />
...

このようにして、ListFragment のカスタム レイアウトを保持しながら、ListFragment の完全に機能する既定の動作を得ることができます。

于 2012-04-19T15:38:50.123 に答える