Макет ListFragment из xml

Как создать ListFragment (из библиотеки поддержки v4) макет из xml? ListFragment настраивает свой макет программно, поэтому, если вы хотите изменить его, вам нужно возиться с добавлением/удалением представления.


person sherpya    schedule 02.08.2012    source источник
comment
Пожалуйста, отредактируйте это, чтобы было ясно, в чем проблема (опубликуйте это как вопрос), и поместите решение ниже в разделе ответов.   -  person Bill the Lizard    schedule 27.08.2012
comment
у вас есть пример для ссылки?   -  person sherpya    schedule 27.08.2012
comment
Пост должен быть просто в форме вопроса и ответа. Это похоже на решение, но неясно, на какой исходный вопрос он отвечает.   -  person Bill the Lizard    schedule 27.08.2012
comment
да, вы правы, я просил пример поста, или достаточно переместить тело в ответ и добавить вопрос?   -  person sherpya    schedule 27.08.2012
comment
Да, это было бы идеально. Спасибо.   -  person Bill the Lizard    schedule 27.08.2012


Ответы (2)


Я преобразовал созданный макет в xml, вы можете добавлять/удалять свои виджеты или, например. добавить pulltorefresh решения. Вы не должны менять необходимые идентификаторы. Из-за внутренних идентификаторов, необходимых для некоторых виджетов, необходимо вызвать вспомогательную функцию, и она должна находиться в пространстве имен поддержки v4, поскольку константы являются внутренними с видимостью по умолчанию.

list_loader.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/progress_container_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone" >

        <ProgressBar
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/list_container_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/empty_id"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" />

        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:drawSelectorOnTop="false" >
        </ListView>
    </FrameLayout>
</FrameLayout>

и класс ListFragmentLayout в android.support.v4.app (в вашем проекте вам не нужно изменять банку поддержки v4)

package android.support.v4.app;

import your.package.R;
import android.view.View;

public class ListFragmentLayout
{
    public static void setupIds(View view)
    {
        view.findViewById(R.id.empty_id).setId(ListFragment.INTERNAL_EMPTY_ID);
        view.findViewById(R.id.progress_container_id).setId(ListFragment.INTERNAL_PROGRESS_CONTAINER_ID);
        view.findViewById(R.id.list_container_id).setId(ListFragment.INTERNAL_LIST_CONTAINER_ID);
    }
}

в вашем фрагменте, который расширяет ListFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.list_loader, container, false);
    ListFragmentLayout.setupIds(view);
    return view;
}
person sherpya    schedule 27.08.2012
comment
Вы имеете в виду, что с этими изменениями он будет работать так, как будто это не пользовательский вид? - person seb; 07.09.2012
comment
Не работает для меня. Похоже, я использую более старую версию библиотеки поддержки. Он даже не содержит класса ListFragmentLayout. Я не предлагаю использовать этот подход. В будущих версиях библиотеки поддержки это может не работать. - person WindRider; 01.02.2013
comment
@sherpya, я последовал твоему ответу и получил ошибку The field ListFragment.INTERNAL_EMPTY_ID is not visible - person Maksim Dmitriev; 26.04.2013
comment
вы должны поместить код в пакет android.support.v4.app, потому что поле имеет видимость по умолчанию - person sherpya; 26.04.2013
comment
возможно, вы все еще можете выбрать значения из соответствующего источника, в r12 они таковы: static final int INTERNAL_EMPTY_ID = 0x00ff0001; статический окончательный int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002; статический окончательный int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003; - person sherpya; 26.04.2013
comment
Привет @sherpya, спасибо за душу :) Но я не могу использовать кнопку в своем макете, так как onClickListener не работает. Вы знаете какой-нибудь обходной путь для этого? - person Nick; 16.07.2014
comment
вы пробовали view.findViewById(R.id.mybutton).setOnClieckListener() до return view? - person sherpya; 16.07.2014

Из Android SDK (ListFragment) (http://developer.android.com/reference/android/app/ListFragment.html):

общедоступное представление onCreateView (расширитель LayoutInflater, контейнер ViewGroup, Bundle saveInstanceState)

Предоставьте реализацию по умолчанию, чтобы вернуть простое представление списка. Подклассы могут переопределять, чтобы заменить их собственным макетом. В этом случае возвращаемая иерархия представлений должна иметь ListView с идентификатором android.R.id.list и, при необходимости, может иметь идентификатор родственного представления android.R.id.empty, который должен отображаться, когда список пуст.

Если вы переопределяете этот метод своим собственным содержимым, рассмотрите возможность включения стандартного макета list_content в файл макета, чтобы сохранить все стандартное поведение ListFragment. В частности, в настоящее время это единственный способ отобразить встроенное неопределенное состояние выполнения.

Поэтому, когда вам нужен собственный layout.xml для FragmentList, переопределите onCreateView и раздуйте свой собственный макет.

Например:

Создайте макет Android (yourlistlayout.xml) и поместите следующий xml в позицию, где вы хотите отобразить свой ListFragment.

    <ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" >
    </ListView>

в свой класс ListFragment поместите следующий код:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.yourlistlayout, null);       
    return v;       
}
person Bas    schedule 26.03.2013
comment
это не будет работать с библиотекой поддержки, так как идентификаторы разные - person sherpya; 11.04.2014