我使用DialogFragments的一些事情:从列表中选择项目,输入文本。
将值(即字符串或列表中的项)返回给调用活动/片段的最佳方法是什么?
目前,我正在使调用活动实现驳回监听器,并给予DialogFragment对活动的引用。然后Dialog在activity中调用ondismiss方法,activity从DialogFragment对象中抓取结果。非常混乱,它不能在配置更改(方向更改),因为DialogFragment失去了对活动的引用。
谢谢你的帮助。
我使用DialogFragments的一些事情:从列表中选择项目,输入文本。
将值(即字符串或列表中的项)返回给调用活动/片段的最佳方法是什么?
目前,我正在使调用活动实现驳回监听器,并给予DialogFragment对活动的引用。然后Dialog在activity中调用ondismiss方法,activity从DialogFragment对象中抓取结果。非常混乱,它不能在配置更改(方向更改),因为DialogFragment失去了对活动的引用。
谢谢你的帮助。
当前回答
我发现了一个简单的方法: 实现这个是你的dialogFragment,
CallingActivity callingActivity = (CallingActivity) getActivity();
callingActivity.onUserSelectValue("insert selected value here");
dismiss();
然后在调用Dialog Fragment的activity中创建相应的函数:
public void onUserSelectValue(String selectedValue) {
// TODO add your implementation.
Toast.makeText(getBaseContext(), ""+ selectedValue, Toast.LENGTH_LONG).show();
}
祝酒词是为了证明它是有效的。为我工作。
其他回答
使用myDialogFragment。setTargetFragment(this, MY_REQUEST_CODE)从你显示对话框的地方,然后当你的对话框完成时,从它可以调用getTargetFragment().onActivityResult(getTargetRequestCode(),…),并在包含的片段中实现onActivityResult()。
这似乎是对onActivityResult()的滥用,特别是因为它根本不涉及活动。但我看到官方谷歌的人推荐它,甚至可能在api演示中。我认为这是g/setTargetFragment()被添加的原因。
正如你在这里看到的,有一个非常简单的方法来做到这一点。
在你的DialogFragment中添加一个接口监听器:
public interface EditNameDialogListener {
void onFinishEditDialog(String inputText);
}
然后,添加对该监听器的引用:
private EditNameDialogListener listener;
这将被用来“激活”监听器方法,也用来检查父Activity/Fragment是否实现了这个接口(见下文)。
在“调用”DialogFragment的Activity/FragmentActivity/Fragment中简单地实现了这个接口。
在你的DialogFragment中,你需要在你想要解散DialogFragment并返回结果的地方添加以下内容:
listener.onFinishEditDialog(mEditText.getText().toString());
this.dismiss();
mEditText.getText(). tostring()将被传递回调用Activity。
注意,如果您想返回其他内容,只需更改侦听器所接受的参数。
最后,你应该检查接口是否由父活动/片段实际实现:
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Verify that the host activity implements the callback interface
try {
// Instantiate the EditNameDialogListener so we can send events to the host
listener = (EditNameDialogListener) context;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(context.toString()
+ " must implement EditNameDialogListener");
}
}
这种技术非常灵活,即使你还不想结束对话框,也可以回调结果。
只是把它作为一个选项(因为还没有人提到它)——你可以使用像Otto这样的事件总线。 所以在对话中你要这样做:
bus.post(new AnswerAvailableEvent(42));
并让你的调用者(Activity或Fragment)订阅它:
@Subscribe public void answerAvailable(AnswerAvailableEvent event) {
// TODO: React to the event somehow!
}
关于一个对话片段
class AbcDialogFragment(private val ondata: (data: String) -> Unit) : DialogFragment() {}
显示片段/活动对话框的代码
val abcDialogFragment = AbcDialogFragment(ondata = {data-> })
abcDialogFragment.show(requireActivity().supportFragmentManager, "TAG")
在对话片段中,你可以在对话片段关闭或任何点击监听器时调用onData。
不同的方法,允许一个片段与它的活动通信:
1)在片段中定义一个公共接口,并为其创建一个变量
public OnFragmentInteractionListener mCallback;
public interface OnFragmentInteractionListener {
void onFragmentInteraction(int id);
}
2)将活动转换为片段中的mCallback变量
try {
mCallback = (OnFragmentInteractionListener) getActivity();
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
3)在你的活动中实现监听器
public class MainActivity extends AppCompatActivity implements DFragment.OnFragmentInteractionListener {
//your code here
}
4)在活动中覆盖OnFragmentInteraction
@Override
public void onFragmentInteraction(int id) {
Log.d(TAG, "received from fragment: " + id);
}
更多信息:https://developer.android.com/training/basics/fragments/communicating.html