2013-05-14 24 views
7

Witam Mam DialogFragment, który wyświetla listę opcji dla użytkownika, jedną z tych opcji jest opcja "Usuń", gdy użytkownik naciśnie opcję usuwania Chcę pokazać kolejny DialogFragment jako potwierdzenie, niestety okno dialogowe potwierdzenia nie jest wyświetlane.Pokaż DialogFragment z innego DialogFragment

tutaj jest mój kod kod

Pierwszy fragment

public class ContactDialogOption extends SherlockDialogFragment { 

    public static final String TAG = ContactDialogOption.class.getSimpleName(); 

    public ContactDialogOption() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     builder.setIcon(R.drawable.ic_launcher); 
     builder.setTitle(R.string.options); 

     builder.setItems(new String[] { 

     getString(R.string.call), getString(R.string.send_message), 
       getString(R.string.copy), getString(R.string.edit), 
       getString(R.string.delete) 

     }, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
          if(which == 4) //delete 
          { 
FragmentManager mgr = getActivity().getSupportFragmentManager(); 
    FragmentTransaction ft = mgr.beginTransaction(); 
     Fragment old = mgr.findFragmentByTag("SecondFragment"); 
     if (old != null) { 
      ft.remove(old); 
     } 
     ft.addToBackStack(null); 


fragment.show(ft, fragmentTag); 
          } 
      } 
     }); 

     return builder.create(); 
    } 
} 
+0

wydaje się nie mogę pokazać DialogFragment z metody onClick !!! – user4o01

+0

gdzie tworzysz drugi fragment, który chcesz pokazać? –

Odpowiedz

0

Jest to kod, który działa dla mnie:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    if (getArguments() == null) { 
     throw new InvalidParameterException("The key types dialog needs the protocol id to be in the arguments"); 
    } 
    if (mCallback == null) { 
     throw new InvalidParameterException("The key types dialog needs an callback to be set"); 
    } 

    mProtocolId = getArguments().getInt(ApplicationConstants.FragmentsConstants.PROTOCOL_ID); 
    final List<KeyTypeEntity> allKeyTypes = BusinessFacade.getInstance(getActivity()).KeyTypeLogic.getAllKeyTypes(); 

    ArrayAdapter<KeyTypeEntity> keyTypeAdapter = new ArrayAdapter<KeyTypeEntity>(getActivity(), android.R.layout.simple_list_item_1, allKeyTypes); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    builder.setTitle("").setAdapter(keyTypeAdapter, new OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      final KeyTypeEntity keyTypeEntity = allKeyTypes.get(which); 
      AlertDialog.Builder number = new AlertDialog.Builder(getActivity()); 

      List<String> keyNumbers = new ArrayList<String>(); 

      for (int i = 0; i < 50; i++) { 
       keyNumbers.add("" + (i + 1)); 
      } 
      ArrayAdapter<String> kAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, keyNumbers); 

      number.setTitle("").setAdapter(kAdapter, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        addNewKey(keyTypeEntity, which + 1); 
       } 
      }); 
      number.show(); 
     } 
    }).setOnCancelListener(new OnCancelListener() { 
     @Override 
     public void onCancel(DialogInterface dialog) { 
      mCallback.onDialogClosed(); 
     } 
    }); 

    mDialog = builder.create(); 
    return mDialog; 
} 

W pierwszym click obsługi po prostu utworzyć nowe okno i Pokaż to. Spowoduje to zamknięcie pierwszego okna dialogowego, otwarcie drugiego, a gdy użytkownik kliknie element na liście, zostanie wywołany drugi moduł obsługi kliknięcia.

Nadzieja to pomaga, a ja nie jestem zbyt późno :)

+0

Naprawdę nie rozumiem ... po co tona kodu z twojego projektu, który nie ma nic wspólnego z pytaniem? To po prostu psuje się z umysłami początkującymi –

6

Mam dokładnie ten sam problem, taka sytuacja nie zdarza się podczas próby otwarcia DialogFragment z Fragment.

Jedynym rozwiązaniem znalazłem zmodyfikować następujące połączenia:

fragment.show(ft, fragmentTag); 

Do:

fragment.show(getFragmentManager(), fragmentTag); 

Problem z tego rozwiązania jest to, że nie może pracować na FragmentTransition.

Nie rozumiem, dlaczego zachowanie jest inne niż w przypadku fragmentów.

2

Natknąłem się na ten sam problem polegający na tym, że nie można wyświetlić innego DialogFragmenta z poziomu słuchaczy dodatnich i ujemnych pierwszego uruchomienia DialogFragment. Moim rozwiązaniem było natychmiastowe wywołanie pierwszego fragmentu, który umożliwia drugiemu DialogFragmentowi dołączanie i wyświetlanie z powodzeniem.

// Call this before adding the second dialog fragment activity.getSupportFragmentManager().popBackStackImmediate();

2

Proszę zaznaczyć to poniższy kod. Mam nadzieję, że to pomoże wielu z was!

public class SubcategoryFragment extends DialogFragment { 

public SubcategoryFragment() { 

} 

public static SubcategoryFragment newInstance(Integer code, String name) { 
    SubcategoryFragment fragment = new SubcategoryFragment(); 

    mCode = code; 
    mTitle = name; 
    return fragment; 
} 


@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    liststring = new ArrayList<>(); 

    getAdapter(); 

} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_subcategory, container, false); 
    gridView = (GridView) view.findViewById(R.id.sub_grid); 


    return view; 

} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    closeDialog = (ImageView) getDialog().findViewById(R.id.closeDialog); 
    title = (TextView) getDialog().findViewById(R.id.dialogTitle); 
    gridView = (GridView) getDialog().findViewById(R.id.sub_grid); 

    title.setText(String.format("Choose %s", mTitle)); 
    closeDialog.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      getDialog().dismiss(); 
     } 
    }); 


} 

@Override 
public Dialog onCreateDialog(@NonNull Bundle savedInstanceState) { 
    Dialog dialog = super.onCreateDialog(savedInstanceState); 


    // request a window without the title 
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 

    // closeDialog = (ImageView) dialog.findViewById(R.id.closeDialog); 

    return dialog; 

} 



public void getAdapter() { 

     gridAdapter = new HomeSubGridViewAdapter(getContext(), R.layout.gridview_custom_layout, liststring); 
     gridView.setAdapter(gridAdapter); 

} 


} 

Jest to metoda na wywołanie okna z fragmentem

fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); 
        SubcategoryFragment postalFragment = SubcategoryFragment.newInstance(Integer.valueOf(item.getId()), item.getName()); 
        postalFragment.show(fragmentManager, "SubcategoryFragment"); 

krępuj się zapytać, czy czujesz jakikolwiek problem jest to, że

0

można przekazać FragmentManage do newInstance() metody Pierwszej DialogFragment wtedy może go użyć do pokazania nowego dialogfragment to jest mój kod.

private static FragmentManager fragmentManager; 

public static PlayListDialog newInstance(Context context, FragmentManager fragmentManager1) { 
    playListDialog = new PlayListDialog(); 
    mContext = context; 
    fragmentManager = fragmentManager1; 
    return playListDialog; 
} 

@Override 
public void createNewPlaylist() { 
    NewPlayListDialog newPlayListDialog = NewPlayListDialog.newInstance(mContext); 
    newPlayListDialog.showDialog(fragmentManager.beginTransaction(),fragmentManager.findFragmentByTag("newdialog")); 
} 
0

Niedawno miałem ten problem i żadna z powyższych opcji nie sprawdziła się u mnie. Próbowałem za pomocą poniższego sposobu:

DialogFragment fragment = new MyFragment(); //where MyFragment is my fragment I want to show 
fragment.setCancelable(true); 
fragment.show(getSupportFragmentManager(), "timePicker"); 

Będzie TYLKO działać, jeśli używasz to w działalności (tj.e wywołać fragment okna dialogowego z klasy aktywności).

ja to jednak ustalona przez rzutowanie w dół mojego wystąpienia aktywności do aktywności AppCompat i używając go nazwać getSupportFragment() jak pokazano poniżej:

DialogFragment timeFragment = new TimePicker(); 
timeFragment.setCancelable(true); 
AppCompatActivity activity = (AppCompatActivity) getActivity(); 
timeFragment.show(activity.getSupportFragmentManager(), "timePicker"); 

Mam nadzieję, że to pomaga .. Wesołych kodowania !!

Powiązane problemy