【问题标题】:Communication between fragments/dialogs in androidandroid中片段/对话框之间的通信
【发布时间】:2012-06-03 02:20:00
【问题描述】:

我有一个包含两个片段的活动:一个用于在网格视图中显示产品,另一个用于显示用户添加到订单中的产品 (ListFragment)。当用户在网格视图中单击产品时,我需要显示一个对话框(DialogFragment),在其中询问所需产品的数量。然后,当用户在对话框中单击接受时,我希望产品出现在 ListFragment 中。

一方面,我必须将产品对象传递给对话框,以便将其名称显示为对话框的标题(例如)。所以我所做的就是这样传递它:

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

我觉得没关系,如果我错了,请纠正我。但是,在正按钮的 onClick 事件中,我必须检索对话框中引入的数量并将其传递给另一个片段(ListFragment),此时它应该立即显示在列表中。

我该怎么做?

提前致谢

【问题讨论】:

    标签: android android-fragments android-dialogfragment


    【解决方案1】:

    recommended approach是从DialogFragment到Activity使用Interface进行通信,再从Activity到Fragment。

    在你的活动中:

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

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

    R.layout.alert_dialog_text_entry 的 XML 来自 API Demos。它不适合您从用户那里获取数量的用例,但它说明了使用自定义布局从用户那里获取价值。

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

    【讨论】:

    • 导致循环继承?
    • 我强烈觉得这个答案解释了更多关于片段(DialogFragment)和活动(Main)之间的通信请检查这个线程有一个类似的问题:stackoverflow.com/q/18561119/3987745
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多