7

2つのフラグメントを持つアクティビティがあります。1つはグリッドビューで製品を表示するためのもので、もう1つはユーザーが注文に追加する製品を表示するためのものです(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)に渡す必要があります。その瞬間、リストに即座に表示されます。

どうすればそれができますか?

前もって感謝します

4

1 に答える 1

10

推奨される方法は、Interface を使用して DialogFragment から Activity に通信し、次に 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>
于 2012-06-03T03:07:55.507 に答える