17

Estoy intentando personalizar el diseño del fragmento devolviendo mi propia jerarquía de vista desde onCreateView(LayoutInflater, ViewGroup, Bundle). Esto infla mi vista personalizada, pero parece apilar las vistas en lugar de inflar dentro, veo todo a la vez. Cualquier ayuda es apreciada.Android + ListFragment con una jerarquía de vista personalizada

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> 
+0

también tomar nota, estoy usando android-apoyo-v4. A partir de los documentos de android, que establece claramente: "ListFragment tiene un diseño predeterminado que consiste en una sola vista de lista Sin embargo, si lo desea, puede personalizar el diseño fragmento mediante la devolución de su propia vista de jerarquía de onCreateView (. LayoutInflater, ViewGroup, Bundle). Para hacer esto, su jerarquía de vistas debe contener un objeto ListView con el id "@android: id/list" (o una lista si está en el código ). " – worked

Respuesta

33

no volvía la nueva vista en el método de la clase onCreateView ListFragment. Por ejemplo:

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

¡Todo funciona bien ahora en la tierra de Android!

+4

La primera línea en su 'onCreateView' no es necesaria (en realidad no está haciendo nada ...) El inflador ya está pasado (que usted usa). – ashughes

+1

Buen punto ... actualizado. – worked

+0

¿Podría dar más detalles? –

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

La lista no es aceptada, está buscando un fragmento.

2

creo que será mejor que

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

utilizar este modelo, funciona perfectamente!

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

la vista del público inflado (XmlPullParser analizador, raíz ViewGroup, attachToRoot booleano)

attachToRoot Si la jerarquía de inflado debe estar unido al parámetro de raíz? Si es falso, root solo se usa para crear la subclase correcta de LayoutParams para la vista raíz en el XML.

2

forma optimizada y el código de tiro

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