Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Communication between fragments/dialogs in android

I have an activity with two fragments: one for showing products in a grid view, and the other to show the products that the user adds to the order (ListFragment). When the user clicks a product in the grid view, what I need is to display a dialog (DialogFragment) in which I ask the quantity of product wanted. Then, when the user clicks Accept in the dialog, I want the product to appear in the ListFragment.

On one hand, I have to pass the product object to the dialog in order to show its name as the dialog's title (for example). So what I did was to pass it this way:

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

I think that that's okay, please correct me if I'm wrong. But then, in the onClick event of the positive button, I have to retrieve the quantity introduced in the dialog and pass it to the other fragment (the ListFragment), moment in which it should be displayed in the list instantly.

How could I do that?

Thanks in advance

like image 700
olistic Avatar asked Jun 03 '12 02:06

olistic


People also ask

How can two fragments communicate Android?

We can communicate within fragments using the ViewModel. We can also communicate between fragments using Interface.

What is the use of dialog fragment in Android?

Android DialogFragments. DialogFragment is a utility class which extends the Fragment class. It is a part of the v4 support library and is used to display an overlay modal window within an activity that floats on top of the rest of the content. Essentially a DialogFragment displays a Dialog but inside a Fragment.


1 Answers

The recommended approach is to communicate from the DialogFragment to the Activity using an Interface, and then from the Activity to the Fragment.

In your activity:

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

Then the DialogFragment inner class

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

The XML for R.layout.alert_dialog_text_entry is from the API Demos. It doesn't fit your use case of getting a quantity from the user, but it illustrates using a custom layout to get a value from the user.

<?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>
like image 94
antew Avatar answered Sep 20 '22 14:09

antew