Communication between fragments/dialogs in android

后端 未结 1 869
梦毁少年i
梦毁少年i 2020-12-16 05:26

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 u

相关标签:
1条回答
  • 2020-12-16 06:15

    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>
    
    0 讨论(0)
提交回复
热议问题