簡體   English   中英

在DialogFragment的onClick方法中從MainActivity調用方法

[英]Invoking methods from MainActivity within the onClick methods of a DialogFragment

我正在嘗試使用DialogFragment在MainActivity中顯示一個對話框。 根據用戶對對話框的反應,我想調用MainActivity.java文件中定義的方法(例如onActivityResult ,但最好還是自定義方法)。

在ashishduh對這個問題的答復之后,我將DialogFragment定義如下(在單獨的Java文件中):

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;

public class YesNoDialog extends DialogFragment {
public static final String ARG_TITLE = "YesNoDialog.Title";
public static final String ARG_MESSAGE = "YesNoDialog.Message";

public YesNoDialog() {}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{   Bundle args = getArguments();
    String title = args.getString(ARG_TITLE);
    String message = args.getString(ARG_MESSAGE);

    return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                }
            })
            .create();
}
}

相應地,我嘗試像這樣從MainActivity啟動它:

    public void openYesNoDialog (View view) {
    DialogFragment dialog = new YesNoDialog();
    Bundle args = new Bundle();
    args.putString(YesNoDialog.ARG_TITLE, "title");
    args.putString(YesNoDialog.ARG_MESSAGE, "message");
    dialog.setArguments(args);
    dialog.setTargetFragment(this, YES_NO_CALL);
    dialog.show(getSupportFragmentManager(), "tag");
}

其中的openYesNoDialog是由activity_main.xml布局文件中的按鈕觸發的。

我面臨的問題是setTargetFragment(this, YES_NO_CALL)無法正常工作,因為“ this”對應於我的MainActivity,但是setTargetFragment(自然地)期望一個Fragment且沒有Activity。 問題是我不知道在第一個參數中引用什么,因為除了我試圖構建的DialogFragment外,我在代碼中完全沒有使用Fragments。 因此,我想知道您會鼓勵采用以下哪種策略來解決我的問題(甚至不確定它們是否都可能有效):

1.)使用類似於setTargetFragment的方法,該方法允許設置目標Activity。 (某種“ setTargetActivity”方法;如果存在這種情況,此解決方案對我來說最簡單,但我還沒有發現任何類似的東西)。

2.)用Fragments編寫所有內容,並使用“ MainFragment”代替MainActivity。 然后,我可以輕松地將此“ MainFragment”作為帶有“ this”的合理目標片段。

3.)使用完全不同的方法(例如,不將方法放在活動中,而在活動和片段實現中都放在接口中,但是實際上,我也想在DialogFragment內部使用活動的TextViews,所以我認為這是可能是一個問題)

非常感謝您的幫助。

最后一條評論:請注意,我在導入中使用v4支持庫來支持向后兼容性,如Dialogs上的Android教程中所建議。

例如,這就是為什么我需要使用getSupportFragmentManager()而不是getFragmentManager()來使當前已經在工作的東西起作用的原因。 因此,這就是我對超鏈接所引用的代碼進行微小修改的原因。

我們應使用getTargetFragmentsetTargetFragment進行Fragment與Fragment之間的通信,

對於“ Activity Fragment通信,可以使用兩種方法

  1. 您可以使用界面進行通訊

  2. 您可以使用本地廣播

接口通訊

在對話框片段中創建一個接口,

public class YesNoDialog extends DialogFragment {
   public interface OnDialogActionListener {
       public void onClickDialog();
   }

   private OnDialogActionListener mListener;

   @Override
   public void onAttach(Context context) {
       mListener = (OnDialogActionListener) context;
   }

   // Your code

               @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    mListener.onClickDialog();
                }

}

在您的活動中,您可以實現和覆蓋功能,您將在Activty中獲得回調。

您可以簡單地使用接口。 只需在單獨的類中定義接口,然后根據您的需要將方法聲明為onClickEvent / onSuccess,並在您的活動中覆蓋它,並在該方法中的活動中執行您的任務即可。 然后從是/否單擊按鈕的對話框中調用此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM