2012-03-01 13 views
7

básicamente esta es mi aplicación (idea) para una tableta orientación horizontal: Dos fragmentos, fragmento de la izquierda es un archivo de lista poblado por un archivo resource.xml (funcionó).Programativamente agregar fragmentos al grupo de vista

Se supone que el fragmento derecho cambia dinámicamente el fragmento y el diseño según el elemento de la lista en que el usuario haga clic. Google hasta ahora me dijo que necesito agregar y eliminar programáticamente fragmentos a un grupo de vistas para hacer eso. ¿Está bien?

Básicamente la cuestión es/son:

  1. ¿Cómo se crea el ViewGroup y donde (Main.java o menufragment.java)?
  2. ¿Cómo coloco el ID dinámico "usuario hizo clic en ID 3 en la lista, así que agregue el fragmento 3 al grupo de vista"
  3. ¿Qué debo agregar a mi archivo main.xml? obtuvo el fragmento para el listfragment allí, ¿qué agregar para el grupo de vista dinámico?

EDIT:

Así que esto es lo que parece mi actividad como: Main.java

public class Main extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 
} 

Ésta es mi listfragment MenuFragment.java

public class MenuFragment extends ListFragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.listfragment, container, false); 

} 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    setListAdapter(new ArrayAdapter<String>(getActivity(), 
      android.R.layout.simple_list_item_1, 
      getResources().getStringArray(R.array.listmenu))); 
    }  



    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 
     Main activity = (Main) getActivity(); 
    } 


} 

y finalmente mi main.xml

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

<fragment 
    android:id="@+id/list" 
    android:layout_width="200dp" 
    android:layout_height="fill_parent" 
    android:layout_alignParentTop="true" 
    android:layout_weight="1" 
    class="com.mwerner.fragmentstest.MainMenu" /> 

<View 
    android:id="@+id/contentview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@+id/list" /> 

</RelativeLayout> 

La matriz de cadenas que tengo en mi archivo XML que rellena la lista se llama "listmenu"

Soy un principiante. Plaese dime ¿dónde debo poner el código que anotaste?

Gracias, Max

+1

Un ViewGroup es solo un contenedor, como LinearLayout o RelativeLayout. Se debe agregar al archivo de diseño de la actividad (res/layout/activity.xml). Dale a tu ViewGroup una identificación y luego puedes hacer referencia a ella usando el método 'findViewById'. – twaddington

Respuesta

7

Echa un vistazo a estos temas Fragmento:

Esencialmente, usted querrá tener el fragmento contar la izquierda Actividad principal qué elemento está seleccionado. Luego, la Actividad puede agregar/eliminar el fragmento correcto en el panel de la derecha.

Tenga en cuenta que crear/destruir un Fragmento es mucho trabajo para el sistema. Si puede lograr tener un solo Fragmento en el panel derecho, será mucho más eficiente. A continuación, puede invocar métodos en esa instancia de Fragmento sin crear nuevos Fragmentos.

EDITAR (ejemplo):

Su aplicación Actividad principal con método personalizado:

public class Main extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    /** Called by the left fragment */ 
    public void updateRightPane(long id) { 
     // Get the data with the selected item id 
     // ... 

     // Create a new fragment 
     MyFragment fragment = new MyFragment(data); 

     // Update the layout 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     // The id specified here identifies which ViewGroup to 
     // append the Fragment to. 
     ft.add(R.id.view_group_id, fragment); 
     ft.commit(); 
    } 
} 

La aplicación onListItemClick para MenuFragment.java:

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    // Get the parent Activity 
    Main activity = (Main) getActivity(); 

    // Pass the selected item id to the Activity method 
    // Note: Feel free to update this method to accept additional 
    //  arguments (e.g. position). 
    activity.updateRightPane(id); 
} 

Por último, el archivo de diseño:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/view_group_id" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <!-- More views here... --> 

</RelativeLayout> 
+0

Gracias, solo un seguimiento: 1) ¿Cómo le digo a onlistitemclick en mi listfragment que cambie la vista del panel derecho para cargar otro fragmento y diseño? 2) No necesito destruir fragmentos, solo puedo ponerlos en el backstack si eso es más fácil en la memoria. Básicamente, quiero que solo se muestre un "Fragmento de Detalles" a la derecha, es decir, el último en el que el usuario hizo clic en la lista. – Killerpixler

+1

Your ListFragment tiene un método [getActivity] [1]. Puede escribir un método público en la actividad del host que acepte algunos argumentos y cambie el panel derecho cuando se invoque. Llame a 'getActivity' desde el oyente de Fragment's onListItemClick izquierdo y eche el resultado al tipo de actividad padre. Luego invoque su método público. Algo como 'updateDetailsPane (id largo)' debería funcionar. 'MyActivity activity = (MyActivity) getActivity();' [1]: http://developer.android.com/reference/android/app/Fragment.html#getActivity%28%29 – twaddington

+0

Publiqué mi código en la edición, entiendo lógicamente lo que dices, pero no cómo implementarlo en sentido código. Por favor ayuda: S – Killerpixler

Cuestiones relacionadas