2012-06-03 13 views
7

Tengo una actividad con dos fragmentos: uno para mostrar productos en una vista de grilla y el otro para mostrar los productos que el usuario agrega a la orden (Fragmento de lista). Cuando el usuario hace clic en un producto en la vista de cuadrícula, lo que necesito es mostrar un cuadro de diálogo (DialogFragment) en el que solicite la cantidad de producto deseado. Luego, cuando el usuario haga clic en aceptar en el cuadro de diálogo, quiero que el producto aparezca en ListFragment.Comunicación entre fragmentos/cuadros de diálogo en android

Por un lado, tengo que pasar el producto objeto al cuadro de diálogo para mostrar su nombre como el título del cuadro de diálogo (por ejemplo). Así que lo que hice fue pasar de esta manera:

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(); 
     } 
    } 

Creo que es okey, corrígeme si me equivoco. Pero luego, en el evento onClick del botón positivo, tengo que recuperar la cantidad introducida en el diálogo, y luego pasarlo al otro fragmento (ListFragment), y luego debe mostrarse en la lista al instante.

¿Cómo podría hacer eso?

Gracias de antemano

Respuesta

10

El recommended approach es comunicar desde el DialogFragment a la actividad mediante una interfaz, y luego de la Actividad al fragmento.

En su actividad:

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(); 
    } 
} 

A continuación, la clase 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(); 
    } 
} 

El XML para R.layout.alert_dialog_text_entry es del API Demos. No se ajusta a su caso de uso de obtener una cantidad del usuario, pero ilustra el uso de un diseño personalizado para obtener un valor del usuario.

<?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

Causas herencia cíclica? –

+0

Creo firmemente que esta respuesta explica más acerca de la comunicación entre un Fragmento '(DialogFragment)' y una Actividad '(Principal)' Por favor, consulte este hilo con una pregunta similar: https://stackoverflow.com/q/18561119/3987745 –