2013-04-12 12 views
8

ho creato il seguente DialogFragment derivandolo dalla documentazione Android:Come eseguire l'azione dopo il pulsante DialogFragment positivo cliccato

public class PayBillDialogFragment estende DialogFragment {

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 

     final Bundle b = this.getArguments(); 
     // Use the Builder class for convenient dialog construction 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage("Paga bollettino") 
       .setPositiveButton("Paga", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // FIRE ZE MISSILES! 


        } 
       }) 
       .setNegativeButton("Cancella", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // User cancelled the dialog 
        } 
       }); 
     // Create the AlertDialog object and return it 
     return builder.create(); 

    } 





} 

Da un altro frammento (un ListFragment), quando si fa clic su una riga dell'elenco per aprire DialogFragment e dopo aver premuto il pulsante positivo di DialogFragment, desidero poter rimuovere la riga selezionata di ListFragment e anche chiamare un metodo per eseguire un'azione remota associata alla rimozione. ho implementato il ListFragment come segue:

public static class ListFragment extends android.support.v4.app.ListFragment { 



     ArrayList<String> listItems=new ArrayList<String>(); 


     ArrayAdapter<String> adapter; 


     public static final String ARG_SECTION_NUMBER = "section_number"; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      final View rootView = inflater.inflate(R.layout.list_fragment_view, 
        container, false); 


      ListView lv = (ListView)rootView.findViewById(android.R.id.list); 

      }}); 
      adapter=new ArrayAdapter<String>(this.getActivity(), 
        android.R.layout.simple_list_item_1, 
        listItems); 
       setListAdapter(adapter); 
      return rootView; 
     } 



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



      //opening the dialogfragment 


     } 


    } 




    } 

Quello che non so è come gestire l'azione dopo il click del tasto positiva del DialogFragment. Mi potete aiutare?

MODIFICA: per chiarire, questo è il flusso di lavoro: fare clic sulla lista -> mostra il DialogFragment -> dopo aver cliccato su DialogFragment rimuovere l'elemento dall'elenco.

risposta

1

Per richiamare finestra di dialogo è possibile utilizzare questo:

android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
if (fm.findFragmentByTag("PayBillDialogFragment") == null) { 
    PayBillDialogFragment payBillDialogFragment = new PayBillDialogFragment(); 
    payBillDialogFragment.show(fm, "PayBillDialogFragment"); 
} 

Nella tua dialogFragment,

setPositiveButton("Paga", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     //Add your code here that should execute 
     //when positive button is clicked 
    } 
}); 
+0

Non capisco. Come dovrei essere in grado di rimuovere elementi dal arraylist/arrayadapter dal metodo onClick? – Raffo

2

Hai due opzioni per chiamare il ListFragment da PayBillDialogFragment.

Primo uno uno è raccomandato dalle linee guida di Android. Tutta la comunicazione passa attraverso l'hosting Activity. È così che si ottiene l'hosting Activity chiamando ((HostingActivity)PayBillDialogFragment.getActivity()).deleteItem() all'interno di PayBillDialogFragment.setPositiveButton(onClick()). In HostingActivity.deleteItem() ottenere il gonfiato PayBillDialogFragment e chiamare alcuni metodi di cancellazione in esso.

Vedi http://developer.android.com/guide/components/fragments.html#EventCallbacks

Seconda. È possibile solo DialogFragment.setTargetFragment() durante la creazione dell'oggetto DialogFragment e quindi all'interno di PayBillDialogFragment.setPositiveButton(onClick()) è possibile ottenere PayBillDialogFragment da DialogFragment.getTargetFragment() e chiamare il metodo di eliminazione lì.

Vedi Callback to a Fragment from a DialogFragment

11

Questo è come gestire la comunicazione tra frammento e dialogo frammento

Esempio frammento:

public class MainFragment extends Fragment { 

    private static final int REQ_CODE = 1; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.main_fragment, container, false); 
     Button b = (Button) v.findViewById(R.id.button); 
     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MyDialog dialog = new MyDialog(); 
       dialog.setTargetFragment(MainFragment.this, REQ_CODE); 
       dialog.show(getFragmentManager(), "dialog"); 
      } 
     }); 
     return v; 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Toast.makeText(getActivity(), "Result: " + resultCode, 
       Toast.LENGTH_SHORT).show(); 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

} 

Esempio DialogFragment:

public class MyDialog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage("My dialog message") 
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         notifyToTarget(Activity.RESULT_OK); 
        } 
       }) 
       .setNegativeButton("Cancel", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           notifyToTarget(Activity.RESULT_CANCELED); 
          } 
         }); 
     return builder.create(); 
    } 

    private void notifyToTarget(int code) { 
     Fragment targetFragment = getTargetFragment(); 
     if (targetFragment != null) { 
      targetFragment.onActivityResult(getTargetRequestCode(), code, null); 
     } 
    } 

} 

Questo è l'unico metodo Ho lavorato anche quando cambiavo orientamento.

+0

grazie per avermi mostrato questo. è stato utile – j2emanue

0

Il frammento di elenco utilizzava un adattatore per mostrare gli elementi. L'adattatore richiede input sotto forma di una raccolta. Quindi, quello che puoi fare è, quando l'utente preme dire il pulsante ok sul frammento di dialogo e tu lo comunichi a List Fragment, puoi rimuovere quel particolare elemento dalla Collezione e di nuovo impostare l'Adapter di List Fragment con la collezione modificata.

Problemi correlati