2013-10-10 13 views
5

私はこれを数時間にわたって頭の中に入れようとしています。メインアクティビティに戻り値を返すためのダイアログを開始

メインのFragmentクラスがあり、そのクラスのImageViewから設定したonClickから、単純な「Yes」または「Cancel」オプションを使用してダイアログフラグメントを開始しています。

ユーザーが「OK」をクリックすると、結果コードがメインのフラグメントに送信され、コードを実行するようになります(私の場合は壁紙を設定しています)。

この音はシンプルですが、わかりにくいようです。前もって感謝します。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    final View v = inflater.inflate(R.layout.image_detail_fragment, 
      container, false); 

    mImageView = (RecyclingImageView) v.findViewById(R.id.imageView); 
    mImageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      MyDialogFragment dialog = new MyDialogFragment(); 
      dialog.show(getActivity().getFragmentManager(), 
        "MyDialogFragment"); 

     } 

     public void onDialogOKPressed() { 

    ((ImageDetailFragment) (DialogFragment.this.getParentFragment())) 
        .onDialogOKPressed(); 
      dismiss(); 

     } 
    }); 

    return v; 
} 

ダイアログクラス::私は何とかに戻って結果を取得したいと思い

にOnclickあなたの活動に

class MyDialogFragment extends DialogFragment { 
    private Button ButtonOk; 
    private Button ButtonCancel; 

    public MyDialogFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container); 
     ButtonOk = (Button) view.findViewById(R.id.button1); 
     ButtonCancel = (Button) view.findViewById(R.id.button2); 
     getDialog().setTitle("Set Wallpaper?"); 

     ButtonOk.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

               ((MyDialogFragment)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
       dismiss(); 


      } 

     }); 

     ButtonCancel.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       MyDialogFragment.this.dismiss(); 

      } 
     }); 

     return view; 

    } 
} 

答えて

4

を、OKボタンが押されているに応答するメソッドを追加し、 public void onDialogOKPressed()などです。その後、DialogFragmentであなたのOKボタンのonClickListenerに、この操作を行います。

public void onClick(View v){ 
    ((MyActivity)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
    dismiss(); 
} 

たり、メインのフラグメントに新しい方法を入れて、次の操作を行います。

public void onClick(View v){ 
    ((MyMainFragment)(DialogFragment.this.getParentFragment())).onDialogOKPressed(); 
    dismiss(); 
} 
+0

次に、主なアクティビティが自分のコードを実行するかどうかを知るために、結果を戻す方法はありますか?それは私の質問だった:) – Jack

+0

これはちょうどあなたの活動であなたの新しいメソッドを呼び出します。したがって、この新しいメソッドからコードを実行してください。 OKボタンが押されていないと呼び出されません。結果コードでif/elseブロックを取り除く。あなたは壁紙を設定するように見えるので、新しい方法で、あなたの壁紙を設定します。 – Tenfour04

+0

また、新しいメソッドをフラグメントに置き、 '((MyActivity)getActivity())'を '((MyFragment)getParentFragment()) 'に置き換えることもできます。 – Tenfour04

2

私は、これは古い質問ですけど、受け入れ答えは疑わしいと思われます。特に第1の方法。この方法を使用するとMyDialogFragmentMyActivityの間に密接な結合が導入され、Fragmentを使用する目的を本質的に打ち負かします。 FragmentActivityに接続されていることを認識しているに過ぎず、Activityの種類はありません。

第2の方法は、あなたのActivityはすでに、それは私はまだ使用して、より良い方法があると思い、使用するFragmentの種類を知って考えると、ないとして悪いですがinterface

public class MyDialogFragment extends DialogFragment { 

    public interface OnOkButtonClickListener { 
     void onOkButtonClick(); 
    } 

    private OnOkButtonClickListener mOnOkButtonClickListener; 

    private Button mOkButton; 
    private Button mCancelButton; 

    public static MyDialogFragment newInstance() { 
     return new MyDialogFragment(); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     if(context instanceof OnOkButtonClickListener) { 
      mOnOkButtonClickListener = (OnOkButtonClickListener) context; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container, false); 
     getDialog().setTitle("Set Wallpaper?"); 

     mOkButton = (Button) view.findViewById(R.id.button1); 
     mCancelButton = (Button) view.findViewById(R.id.button2); 

     mOkButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mOnOkButtonClickListener != null) { 
        mOnOkButtonClickListener.onOkButtonClick(); 
       } 
      } 
     }; 

     mCancelButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MyDialogFragment.this.dismiss(); 
      } 
     }; 
    } 

} 

その後のことができます。実装interfaceActivityいずれかに:

public class MyActivity extends AppCompatActivity 
     implements MyDialogFragment.OnOkButtonClickListener { 


    @Override 
    public void onOkButtonClick() { 
     // TODO: handle dialog click 
    } 

    // ... 

} 

これもと通信するための推奨される方法ですdeveloper training site

関連する問題