Android: utiliser des fragments par programme

Pour certaines raisons, je ne peux pas utiliser les fichiers de mise en page xml.

Mais j'ai besoin de créer une application Android pour tablettes.

  • Comment ajouter des effets sonores sur Android?
  • Comportement étrange de l'application hybride CrossWalk lors de la lecture de l'audio web m4a
  • Android - Configuration de Retrofit / Apache HttpClient for Digest Auth
  • API d'historique Android 4.0 et HTML5
  • NotImplementedException sur Android
  • Comment convertir une date jj / mm / aaaa en aaaa-MM-jj HH: mm: ss Android
  • J'ai décidé d'utiliser des fragments.

    Je souhaite créer la même mise en page que ce xml génère:

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment class="com.example.ItemsList" android:id="@+id/items_list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" /> <FrameLayout android:id="@+id/item_details" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" android:background="?android:attr/detailsElementBackground" /> </LinearLayout> 

    Mais j'ai des problèmes avec l'ajout de fragments à mon linéaire:

      public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(createUI()); } private View createUI() { LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setLayoutParams(new LinearLayout.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT)); layout.setId(0x101); { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(0x101, new ItemsList()); fragmentTransaction.add(0x101, new ItemDetails()); fragmentTransaction.commit(); } return layout; } 

    En fait, je ne peux même pas créer LinearLayout avec deux fragments identiques:

      ... fragmentTransaction.add(0x101, new ItemsList()); fragmentTransaction.add(0x101, new ItemsList()); ... 

    Aidez-nous

    Bien que je ne peux pas comprendre pourquoi devons-nous déclarer "FrameLayout" pour itemDetails Fragment mais "fragment" est suffisant pour itemsList ListFragment?

    UPD:

    Pour ce faire, il suffit d'ajouter un troisième paramètre:

      ... fragmentTransaction.add(0x101, new ItemsList(), "uniqueTag1"); fragmentTransaction.add(0x101, new ItemsList(), "uniqueTag2"); ... 

    La valeur par défaut pour le paramètre tag est null, alors j'essayais de créer deux éléments différents avec des ids identiques. Merci à p-lo pour son commentaire.

  • Android ScrollView ne peut héberger qu'un enfant direct
  • Ai-je besoin d'un fournisseur de contenu avec un chargeur de curseur?
  • Comment insérer l'horodatage dans une colonne de base de données SQLite? Utilisation du temps de fonction ('maintenant')?
  • Si A extends B étend C, pourquoi puis-je lancer vers A mais obtenir un casting ClassCastException vers C?
  • Green DAO vs ORM lite vs Active Android
  • Notifications extensibles personnalisées dans Jelly Bean (4.1)
  • 2 Solutions collect form web for “Android: utiliser des fragments par programme”

    J'ai trouvé la solution.

    (La meilleure façon a été ajoutée à la question. Merci, p-lo)

    Si vous souhaitez placer plus d'un fragment sur l'activité, vous devez créer des mises en page pour chaque fragment:

      private View createUI() { LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setLayoutParams(new LinearLayout.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT)); LinearLayout innerLayout1 = new LinearLayout(this); innerLayout1.setLayoutParams(new LinearLayout.LayoutParams(300, ViewGroup.LayoutParams.FILL_PARENT)); innerLayout1.setId(ITEMS_LIST_ID); { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(ITEMS_LIST_ID, new ItemsList()); fragmentTransaction.commit(); } layout.addView(innerLayout1); LinearLayout innerLayout2 = new LinearLayout(this); innerLayout2.setLayoutParams(new LinearLayout.LayoutParams(300, ViewGroup.LayoutParams.FILL_PARENT)); innerLayout2.setId(ITEM_DETAILS_ID); { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(ITEM_DETAILS_ID, new ItemDetails()); fragmentTransaction.commit(); } layout.addView(innerLayout2); return layout; } 

    Ce dont vous avez manqué, c'est LayoutInflator. Voir cet exemple à partir d'une activité:

     private void createPolicyTable() { if (customerInfo.getPolicies() == null || customerInfo.getPolicies().isEmpty()) { Log.v(TAG, "no policies were found."); return; } LinearLayout policyTable = (LinearLayout)findViewById(R.id.manage_my_policy_policy_table); LayoutInflater inflater = getLayoutInflater(); for(int i = 0; i < customerInfo.getPolicies().size(); i++) { Policy policy = customerInfo.getPolicies().get(i); LinearLayout row = (LinearLayout)inflater.inflate(R.layout.policy_table_row, null); ImageView type = (ImageView)row.findViewById(R.id.policy_table_row_type); if (policy instanceof PersonalVehiclePolicy) { type.setImageResource(R.drawable.auto_policy); } else if (policy instanceof HomeownersPolicy) { type.setImageResource(R.drawable.home_policy); } ((TextView)row.findViewById(R.id.policy_table_row_policy_number)).setText(policy.getPolicyNumber()); ((TextView)row.findViewById(R.id.policy_table_row_amount_due)).setText(policy.getAmountDue()); ((TextView)row.findViewById(R.id.policy_table_row_due_date)).setText(policy.getDueDate()); row.setOnClickListener(createPolicyDetailsOnClickListener(policy)); policyTable.addView(row); } } 

    Et la mise en page qui est gonflée:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/ListItem"> <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="*"> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="5dp"> <TextView android:text="@string/type_label" style="@style/RowLabel" /> <ImageView android:id="@+id/policy_table_row_type" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView style="@style/RowLabel" android:text="@string/policy_num_label" android:paddingRight="5dp" /> <TextView android:id="@+id/policy_table_row_policy_number" style="@style/DefaultText" /> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="5dp"> <TextView style="@style/RowLabel" android:text="@string/due_label" android:paddingRight="5dp" /> <TextView android:id="@+id/policy_table_row_amount_due" style="@style/DefaultText" android:paddingRight="5dp" /> <TextView style="@style/RowLabel" android:text="@string/on_lc" android:paddingRight="5dp" /> <TextView android:id="@+id/policy_table_row_due_date" style="@style/DefaultText" /> </TableRow> </TableLayout> </LinearLayout> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.