2012-06-03 14 views
7

私は、グリッドビューでの製品の表示とユーザーが注文に追加する製品(ListFragment)を表示する2つのフラグメントを持つアクティビティを持っています。ユーザーがグリッドビューで商品をクリックすると、必要な商品の数量を尋ねるダイアログ(DialogFragment)が表示されます。次に、ユーザーがダイアログでAcceptをクリックすると、ListFragmentに商品が表示されます。androidのフラグメント/ダイアログ間の通信

一方で、ダイアログのタイトルなどの名前を表示するには、オブジェクト製品をダイアログに渡す必要があります。だから私がしたことは、このようにそれを渡すことでした:

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)に渡す必要があります。次にリストに即座に表示されるはずです。

どうすればいいですか?予め

おかげ

答えて

10

recommended approachインターフェイスを使用して、アクティビティに、その後活動からの断片にDialogFragmentから通信することです。あなたの活動で

:次に

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> 
+1

循環的な継承が発生しますか? –

+0

この回答はフラグメント(DialogFragment)とアクティビティ(メイン)の間の通信についてもっと詳しく説明していると強く感じています このスレッドは似たような質問でチェックしてください:https://stackoverflow.com/q/18561119/3987745 –

関連する問題