2012-06-03 21 views
7

Ho un'attività con due frammenti: uno per mostrare i prodotti in un gridview e l'altro per mostrare i prodotti che l'utente aggiunge all'ordine (ListFragment). Quando l'utente fa clic su un prodotto nella visualizzazione griglia, ciò di cui ho bisogno è di visualizzare una finestra di dialogo (DialogFragment) in cui chiedo la quantità di prodotto desiderata. Quindi, quando l'utente fa clic su accetta nella finestra di dialogo, voglio che il prodotto appaia in ListFragment.Comunicazione tra frammenti/finestre di dialogo in Android

Da una parte, devo passare il prodotto oggetto alla finestra di dialogo per mostrare il suo nome come titolo della finestra di dialogo (ad esempio). Quindi quello che ho fatto è stato quello di passare in questo modo:

public static class ProductDialog extends DialogFragment { 

     static ProductDialog newInstance(ProductVO product) { 
      ProductDialog f = new ProductDialog(); 

      Bundle args = new Bundle(); 
      args.putSerializable("product", product); 
      f.setArguments(args); 

      return f; 
     } 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      ProductVO product = (ProductVO) getArguments().getSerializable("product"); 

      return new AlertDialog.Builder(getActivity()) 
        .setIcon(R.drawable.ic_dialog_add) 
        .setTitle(R.string.add_product) 

        ... 

        .setPositiveButton(R.string.accept, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 

          } 
         } 
        ) 
        .setNegativeButton(R.string.cancel, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
          } 
         } 
        ) 
        .create(); 
     } 
    } 

penso che sia okey, correggetemi se sbaglio. Ma poi, nell'evento onClick del pulsante positivo devo recuperare la quantità introdotta nella finestra di dialogo, e poi passarla all'altro frammento (il ListFragment), e quindi dovrebbe essere visualizzato immediatamente nella lista.

Come potrei farlo?

Grazie in anticipo

risposta

10

La recommended approach è comunicare dal DialogFragment alla all'attività utilizzando un'interfaccia, e quindi dal Activity al frammento.

Nella vostra attività:

public class Main extends FragmentActivity implements OnQuantitySelectedListener { 

    public interface OnQuantitySelectedListener { 
     void onFinishEditDialog(String inputText); 
    } 


    @Override 
    public void onFinishEditDialog(String inputText) { 
     Toast.makeText(this, "Quantity: " + inputText, Toast.LENGTH_SHORT).show(); 
    } 
} 

Poi la classe interna DialogFragment

public static class ProductDialog extends DialogFragment { 

    static ProductDialog newInstance(ProductVO product) { 
     ProductDialog f = new ProductDialog(); 

     Bundle args = new Bundle(); 
     args.putSerializable("product", product); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     ProductVO product = (ProductVO) getArguments().getSerializable("product"); 

     LayoutInflater factory = LayoutInflater.from(getActivity()); 
     final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null); 
     mEditText = (EditText) textEntryView.findViewById(R.id.txt_your_name); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.ic_dialog_add) 
       .setTitle(R.string.add_product) 
       .setView(textEntryView) 
       .setPositiveButton(R.string.accept, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          OnQuantitySelectedListener listener = (OnQuantitySelectedListener) getActivity(); 
          listener.onFinishEditDialog(mEditText.getText().toString()); 
         } 
        } 
       ) 
       .setNegativeButton(R.string.cancel, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
         } 
        } 
       ) 
       .create(); 
    } 
} 

L'XML per R.layout.alert_dialog_text_entry è dal API Demos. Non si adatta al tuo caso d'uso di ottenere una quantità da parte dell'utente, ma illustra l'utilizzo di un layout personalizzato per ottenere un valore dall'utente.

<?xml version="1.0" encoding="utf-8"?> 
<!-- Copyright (C) 2008 The Android Open Source Project 

    Licensed under the Apache License, Version 2.0 (the "License"); 
    you may not use this file except in compliance with the License. 
    You may obtain a copy of the License at 

      http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 

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

    <TextView 
     android:id="@+id/username_view" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_marginLeft="20dip" 
     android:layout_marginRight="20dip" 
     android:text="@string/alert_dialog_username" 
     android:gravity="left" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <EditText 
     android:id="@+id/username_edit" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_marginLeft="20dip" 
     android:layout_marginRight="20dip" 
     android:scrollHorizontally="true" 
     android:autoText="false" 
     android:capitalize="none" 
     android:gravity="fill_horizontal" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/password_view" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_marginLeft="20dip" 
     android:layout_marginRight="20dip" 
     android:text="@string/alert_dialog_password" 
     android:gravity="left" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <EditText 
     android:id="@+id/password_edit" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_marginLeft="20dip" 
     android:layout_marginRight="20dip" 
     android:scrollHorizontally="true" 
     android:autoText="false" 
     android:capitalize="none" 
     android:gravity="fill_horizontal" 
     android:password="true" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

</LinearLayout> 
+1

Provoca l'ereditarietà ciclica? –

+0

Ritengo fortemente che questa risposta spieghi di più sulla comunicazione tra un frammento '(DialogFragment)' e un'attività '(Principale)' Si prega di controllare questa discussione con una domanda simile: https://stackoverflow.com/q/18561119/3987745 –