Android + ListFragment с настраиваемой иерархией представлений

Я пытаюсь настроить макет фрагмента, возвращая собственную иерархию представлений из onCreateView(LayoutInflater, ViewGroup, Bundle). Это раздувает мой пользовательский вид, но, кажется, складывает представления вместо раздувания внутри, я вижу все сразу. Любая помощь приветствуется.

MyActivity.java:

public class MyActivity extends FragmentActivity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
            ArrayListFragment list = new ArrayListFragment();
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
        }
    }

    public static class ArrayListFragment extends ListFragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            inflater.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            inflater.inflate(R.layout.main, container);
            return super.onCreateView(inflater, container, savedInstanceState);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            String List[] = {"Larry", "Moe", "Curly"}; 
            setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, List));
        }
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="8dp"
  android:paddingRight="8dp">

  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="THIS IS A BUTTON" />

  <ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00FF00"
    android:layout_weight="1"
    android:drawSelectorOnTop="false" />

  <TextView
    android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF0000"
    android:text="No data" />
</LinearLayout>

person worked    schedule 23.09.2011    source источник
comment
Также следует отметить, что я использую android-support-v4. В документах Android четко указано: ListFragment имеет макет по умолчанию, состоящий из одного представления списка. Однако при желании вы можете настроить макет фрагмента, вернув собственную иерархию представлений из onCreateView(LayoutInflater, ViewGroup, Bundle). Для этого ваша иерархия представлений должна содержать объект ListView с идентификатором @android:id/list (или списком, если он находится в коде).   -  person worked    schedule 25.09.2011


Ответы (5)


Я не возвращал новое представление в методе onCreateView класса ListFragment. Например:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
            View view = inflater.inflate(R.layout.main, null);
            return view;
        }

Теперь все хорошо работает в стране Android!

person worked    schedule 24.09.2011
comment
Первая строка в вашем onCreateView не нужна (на самом деле она ничего не делает...) Инфлятор уже пропущен (который вы используете). - person ashughes; 14.02.2012
comment
Не могли бы вы дать более подробную информацию? - person Pierre-Antoine; 23.11.2013

Я думаю, тебе лучше

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState) {
 View root = inflater.inflate(R.layout.main, container, false);
 return root;
 }
person Maurizio Basile    schedule 10.10.2013

оптимизированный способ и код выстрела

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.list_alphabet, container, false);
    }
person codercat    schedule 03.04.2014

getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();

Список не принимается, ищет фрагмент.

person Archie    schedule 28.06.2012

используйте этот шаблон, работает отлично!

inflater.inflate(R.layout.list_layout, container, false);

раздувание публичного представления (анализатор XmlPullParser, корень ViewGroup, логическое значение attachToRoot)

attachToRoot Следует ли прикреплять раздутую иерархию к корневому параметру? Если false, корень используется только для создания правильного подкласса LayoutParams для корневого представления в XML.

person hoot    schedule 12.01.2014