2011-04-08 3 views
10

J'ai donc créé un DialogFragment qui apparaît comme une boîte de dialogue via ce techniqueEn utilisant FragmentTransaction avec un DialogFragment

Maintenant qu'il est lancé et sur une interaction utilisateur dans ce pop-up, je veux glisser dans un autre fragment de cette boîte de dialogue . J'essaye de faire ceci par l'intermédiaire de FragmentTransaction.add() où je lui donne l'id de l'un des récipients dans cette disposition. A ce stade, je reçois:

java.lang.IllegalArgumentException: No view found for id 0x7f09013f for fragment <fragmentClassThatIWasPushingIn> 

En tant que test rapide, j'ai essayé de le pousser sur un ID de conteneur pas dans la boîte de dialogue, mais dans l'activité principale de support et qui marchait très bien.

Y a-t-il quelque chose à propos de DialogFragments et de ses identifiants de conteneur qui ne permet pas de FragmentTransactions? En tant que stopgap, j'ai demandé à ma transaction de cacher le DialogFragment actuel et de montrer ce nouveau fragment, mais l'animation/affichage est un peu discordante, donc j'aimerais vraiment régler ce problème.

Merci

Répondre

16

Lorsqu'un DialogFragment apparaît en tant Dialog il est pas vraiment un vrai Fragment dans une vue du conteneur. C'est un conteneur Fragment qui est essentiellement un emballage d'un Dialog. Par conséquent, vous ne pouvez pas afficher un Fragment à l'intérieur d'un FragmentDialog. Si vous voulez vraiment faire cela, je pense que le meilleur moyen serait de créer un nouveau Activity comme un Dialog que vous pouvez ensuite ajouter Fragments aussi.

+0

Ceci est correct. Cependant, DialogFragment peut être forcé à agir comme un fragment avec setShowsDialog (false) ;. Vérifie ma réponse – macieksk

1

Il existe actuellement un conteneur comme vous pouvez le voir dans la méthode onCreateView. Vous utilisez le conteneur pour créer votre vue.

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle icicle) { 
    Log.d(TAG, "onCreateView"); 
    View v = inflater 
      .inflate(R.layout.move_folder_dialog, container, false); 

Il semble que FragmentManager ne soit pas en mesure d'obtenir le conteneur.

Serait-ce un bug?

3

alexanderblom est juste que DialogFragment agit comme un dialogue, mais il peut être d'agir comme un fragment avec setShowsDialog(false);

En fin de compte ce qui suit a fonctionné pour moi:

fichier: res/layout/wifidirect_dialog_wifidirect :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/dialog_wifidirect_layout"> 

    <LinearLayout 
     android:id="@+id/frag_container" 
     android:layout_width="match_parent" 
     android:layout_height="250dp" 
     android:orientation="vertical" > 

      <!-- This is replaced during runtime --> 
      <RelativeLayout 
       android:id="@+id/frag_list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:gravity="top" > 
      </RelativeLayout> 
    </LinearLayout> 

    <!-- The Cancel Button --> 
    <View 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
    android:layout_marginBottom="0dp" 
    android:background="?android:attr/dividerVertical" /> 
    <Button 
     android:id="@+id/dialog_wifidirect_cancel" 
     style="?android:attr/buttonBarButtonStyle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/cancel"/>   
</LinearLayout> 

fichier src /.../ WifiDirectDialog.java:

public class WiFiDirectDialog extends DialogFragment { 
     public static final String TAG = "WifiDirectDialog"; 
     public static final String DEVICE_LIST_FRAGMENT_TAG = "WIFIDIRECT_DEVICE_LIST_FRAGMENT"; 


     public static WiFiDirectDialog newInstance(){     
      WiFiDirectDialog wDialog = new WiFiDirectDialog(); 
      //We want this Dialog to be a Fragment in fact, 
      //otherwise there are problems with showing another fragment, the DeviceListFragment 
      wDialog.setShowsDialog(false); 
      //wDialog.setStyle(SherlockDialogFragment.STYLE_NORMAL,android.R.style.Theme_Holo_Light_Dialog); 
      //We don't want to recreate the instance every time user rotates the phone 
      wDialog.setRetainInstance(true); 
      //Don't close the dialog when touched outside 
      wDialog.setCancelable(false); 
      return wDialog; 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      Log.v(TAG,"onCreateView"); 

      View view = inflater.inflate(R.layout.wifidirect_dialog_wifidirect,container, false); 

      //Log.v(TAG,"FragmentTransaction started");    
      ListFragment listFragment = new YourListFragment(); 

      FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
      transaction.addToBackStack(DEVICE_LIST_FRAGMENT_TAG) 
       .replace(R.id.frag_list,deviceListFragment,DEVICE_LIST_FRAGMENT_TAG) 
       .commit(); 
      //Log.v(TAG,"FragmentTransaction finished"); 

      return view; 
     }; 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState){ 
      Log.v(TAG,"onActivityCreated"); 
      super.onActivityCreated(savedInstanceState); 

      Dialog dialog = getDialog(); 
      dialog.setTitle(R.string.wifidirect_dialog_title); 

      // Set button listeners etc.../// 
      Button cancelButton = (Button) view.findViewById(R.id.dialog_wifidirect_cancel); 
      cancelButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) {     
        dismiss(); 
       } 
      }); 
     } 
Questions connexes