0

これが私がやりたいことです:

1)Activityダイアログ内に表示されます。DialogFragmentこのためにandを使用しFragmentManagerて、次のように呼び出します。

dialogFragment.show(fragmentManager, "edit_task_list");

2)DialogカスタムのレイアウトがありますButton。ボタンがクリックされたときに何らかのアクションを実行し、後でダイアログを閉じたいと思います。

すべてをどのように接続すればよいですか?2 つのオプションが表示されます。

1)onclick内の属性Buttonと 内のメソッドActvityDialogそれが私の当初の計画でしたが、からを取得しActivityてそれを却下する方法がわかりません。これが正しい方法ではないとしても、どうすればこれを行うことができるでしょうか? これがどのように機能するかを理解したいと思います。

Dialog2)が で作成されたときに、ボタンのクリック リスナーに設定しますDialogFragment。これには、 から に何らかのコンテキストを渡す必要があるActivityためDialogFragment、これを避けたいと思います (そしてDialogFragmentをできるだけシンプルに保ちます)。

これらのオプションのどれをとるべきですか?

4

4 に答える 4

0

1) ボタンの onclick 属性とアクティビティ内のメソッド。それが私の当初の計画でしたが、アクティビティからダイアログを取得してそれを閉じる方法がわかりません。これが正しい方法ではないとしても、どうすればこれを行うことができるでしょうか? これがどのように機能するかを理解したいと思います。

基本的に、アクティビティは、現在どのダイアログがアクティブであるかを のようなもので記憶/認識しているcurDialog=dialogFragment;必要があります。その後、ボタンの onclick アクションを処理するときに、どのダイアログを閉じるかがわかります。しかし、基本的にボタン ビューが DialogFragment からアクティビティに「リーク」し、オブジェクトのカプセル化が壊れるため、これは本当に良い考えではありません。

2) ダイアログが DialogFragment で作成されるときに、ボタンのクリック リスナーに設定します。これには、Activity から DialogFragment に何らかのコンテキストを渡す必要があるため、これを回避したいと思います (DialogFragment をできるだけシンプルに保ちます)。

前の回答で述べたように、特に を呼び出すことでアクティビティを取得できるため、Context を渡す必要はありませんgetActivity()

解決策は、このダイアログが複数のアクティビティで使用されるかどうかによって異なります。

  1. 単一のアクティビティで使用: @Martin のソリューションは問題なく動作します
  2. 複数のアクティビティで使用: 抽象化を使用して、ユーザーの決定のみがリスナーに渡されるようにすることができます。これは、同じ問題に対して思いついた (変更された) ソリューションです。

    public class BaseDialogFragment extends DialogFragment {
        protected TextView dialogEn;
        protected Button dialogYes;
        private Button dialogNo;
        protected OnSelectListener listener;
    
    public interface OnSelectListener {
        public void onSelect(int type, boolean yes);
    }
    
    public void setOnSelectListener(OnSelectListener listener) {
        this.listener = listener;
    }
    
    public BaseDialogFragment() {
        super();
    }
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.dialog_confirm, container, false);
    dialogYes = (Button) v.findViewById(R.id.yes);
    dialogNo = (Button) v.findViewById(R.id.no);
    
    dialogEn = (TextView) view.findViewById(R.id.dialog_en);
    dialogEn.setText(getArguments().getString("text_en"));
    dialogYes.setOnClickListener(this);
    dialogNo.setOnClickListener(this);
    return v;
    }
    
    public void onClick(View v) {
        if (listener != null) {
            listener.onSelect(getArguments().getInt("type"),
                    v == dialogYes ? true : false);
        }
        getDialog().dismiss();
    }
    }
    

それを使用するには、いくつかの追加情報を提供する必要があります。

    Bundle bundle = new Bundle();
    bundle.putInt("type", type); //type: an unique integer value that helps differentiate result from different dialogs
    bundle.putString("text_en", en); //en: String to be displayed
    dialog.setArguments(bundle);
    dialog.setOnSelectListener(this);

したがって、type上記の値が 115 に設定されている場合、dialogYesボタンをクリックすると、public void onSelect(int type, boolean yes)メソッドが呼び出され、1 番目と 2 番目のパラメーターとして呼び出されます。115true

于 2013-11-02T10:17:29.537 に答える
0

すべての Activity および Fragment クラスには、別の Activity、Fragment、Dialog、または DialogFragment を開始するときに使用する組み込みのコールバック メソッドがあります。

 void onActivityResult(int requestCode, int resultCode, Intent data)

Activity から Dialog を開始したいので、DialogFragment クラスよりも Dialog クラスを使用する方が適しています。Fragment からダイアログを開始する場合は後者の方が適しています。なぜなら、Fragment と通信するための 2 つの方法があるからです ( get/set TargetFragment())

Dialog クラスにはgetOwnerActivity()メソッドがあります。これは、コンストラクターの 1 つを使用してダイアログを作成するときに使用するアクティビティです。

Dialog クラスのボタンに onClickListener を設定します。結果をアクティビティに戻すには:

getOwnerActivity().onActivityResult(intIdentifyingme, Activity.RESULT_OK,
                    intent);
dismiss();  // close the dialog

送信したい追加情報を Intent に入れます。

于 2013-11-02T05:56:49.883 に答える
0

番号 2 コンテキストを渡す必要はありません (渡すべきではありません)。フラグメントとアクティビティ間のコントラクトとして機能するインターフェイスを定義し、それをアクティビティに実装させます。

ダイアログと button.onClick() で、次のようなことを行います (テストされていないコード):

if ( getActivity() != null 
      && !getActivity().finishing() 
      && getActivity() instanceOf YourInterface) {
   ((YourInterface)getActivity()).onSomeNiceMethod();
   dismiss(); // close the dialog (if this is what you want).
}

インターフェイスは次のようになります。

public interface YourInterface {
     void onSomeNiceMethod();
}

そしてあなたのアクティビティ…</p>

public class YourActivity implements YourInterface {
     void onSomeNiceMethod() {
         // Hey! The Button In The Dialog Has Been Pressed!
     }
}
于 2013-11-02T05:16:47.353 に答える