[英]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()來使當前已經在工作的東西起作用的原因。 因此,這就是我對超鏈接所引用的代碼進行微小修改的原因。
我們應使用getTargetFragment
和setTargetFragment
進行Fragment與Fragment之間的通信,
對於“ Activity
Fragment
通信,可以使用兩種方法
您可以使用界面進行通訊
您可以使用本地廣播
接口通訊
在對話框片段中創建一個接口,
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.