Подтвердить что ты не робот

Включая list_content в макет списка, чтобы сохранить функциональность ListFragment

Во-первых, я использую библиотеку совместимости Android V4 rev.3 для моего 1.6 (Donut)

Когда вы сначала создаете ListFragment, он отображает индикатор неопределенного прогресса до тех пор, пока вы не будете использовать setListAdabpter(). Согласно документации ListFragment.onCreateView, если я хочу использовать пользовательскую раскладку:

Если вы переопределяете этот метод своим собственным контентом, рассмотрите возможность включения стандартного макета {@link android.R.layout # list_content} в вашем файле макета, чтобы вы продолжить сохранение стандартного поведения ListFragment. В в частности, это единственный способ иметь встроенный будет показано состояние неопределенного прогресса.

Проблема заключается в том, что когда я перехожу в свой файл макета и пытаюсь: <include layout="@android:layout/list_content" ...> it (eclipse) говорит мне, что

Ресурс не является общедоступным. (в 'layout' со значением '@android: layout/list_content').

Я считаю, что list_content.xml не существует в моем исходном коде V4. что является правильным, поскольку в соответствии с документами оно появилось в API v11.

Я просто предположил, что он будет существовать в источнике библиотеки совместимости, не знаю, если это произойдет...

Единственное другое решение, которое я вижу, - это выкопать исходный код API V11 для Android и скопировать и вставить list_content.xml. Пока же я хотел бы избежать этого хакера. это единственное решение?

4b9b3361

Ответ 1

ListFragment, включенный в библиотеку совместимости, не использует этот макет (list_content) в качестве реального. Возможно, это связано с тем, что оно предлагается как банка, и невозможно упаковать ресурсы. Вот содержание его 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;
}

ListFragment из Android 4.0:

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

Учитывая выбор между копированием файла макета из источника APIv11 и включением этого кода инициализации представления, я думаю, что понятно, какой из них можно считать "хакером";)

Ответ 2

Я был расстроен, увидев, что макет list_content недоступен с использованием библиотеки поддержки. Мой подход состоял в том, чтобы просто повторно использовать метод onCreateView по умолчанию для ListFragment и добавить его как часть моего пользовательского макета:

@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;
}

Я добавил FrameLayout, где ListView использовался в моем настраиваемом макете.

Ответ 3

Одна возможная работа для включения default @android.R.layout/list_content в пользовательский макет при использовании библиотеки совместимости - это создание фиктивного списка:

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, но при этом будет иметь собственный макет.