现在我有:-
1) 1活动,它是从AppCompactActivity扩展而来的主要活动。
2) 1扩展自fragment的类,这是从主活动(1)-ProfileTeacherActivity调用的片段。java
3) 1个从DialogFragment扩展的fragment类,此对话框从fragment(2)-ModalBox调用。java
所以,基本上,这只是一个简单的执行流程。开始时,显示主活动(1)
的应用程序具有具有几个链接的抽屉作为配置文件链接的示例,当单击此链接时,应用程序调用片段(2)
显示配置文件的详细信息。单击编辑按钮后,应用程序将调用包含一些EditText
用于编辑用户配置文件的对话框(3)
。
我想实现的是,在编辑用户配置文件并成功保存到数据库后,我试图将用户数据发送回片段(2),只是为了显示最新更新的信息,但不幸的是,它没有起作用。
以下是我的尝试:
1)在DialogFraank中创建接口(3)-ModalBox.java
public class ModalBox extends DialogFragment{
....
public interface EditProfileModalBoxInterface {
void onFinishEditProfile( HashMap<String, String> dataPassing );
}
...
...
}
2)在DialogFraank里面我也有. setPositiveButton
函数为OK
按钮。-ModalBox.java
public class ModalBox extends DialogFragment{
...
...
public Dialog onCreateDialog(Bundle savedInstanceState ) {
...
builder
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, int id) {
// At here i'm using retrofit2 http library
// to do updating stuff
// and inside success's callback of retrofit2(asynchronous)
// here i call the below function to send data
// dataToSend is a HashMap value
sendBackResultToParent( dataTosend );
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
.....
}
// Function called inside success's callback of retrofit2
public void sendBackResultToParent( HashMap<String, String> data ) {
// instantiated interface
EditProfileModalBoxInterface ls=(EditProfileModalBoxInterface)getTargetFragment();
// declaring interface's method
ls.onFinishEditProfile( data );
}
}
3)最后,我实现了那些接口里面片段
(2)-ProfileTeacherActivity.java
public class ProfileTeacherActivity extends Fragment
implements ModalBox.EditProfileModalBoxInterface{
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState ) {
.....
.....
}
// At here the interface's method did't triggered
@Override
public void onFinishEditProfile( HashMap dataPassedFromDialog ) {
Toast.makeText(getActivity(), "Testing...." , Toast.LENGTH_LONG).show();
}
}
我现在感到困惑的是,只有当我调用这个函数时,问题才会发生inside Reform2 success的回调,在其外部调用时会触发。我认为这是由调用的异步导致的。如果我可以使用Promise或类似的东西,或者是否有任何解决方法?
以下现有解决方案在我的情况下不起作用:
如果上述用例不够清楚或误解,请向我询问更多输入。谢谢你的帮助。问候。
从架构的角度来看,两个片段不应该直接相互通信。容器活动应该负责在其子片段之间传递数据。所以我会这样做:
在容器活动中实现接口,只需将活动中的接口实现附加到对话框类,并在需要时调用该接口方法。类似这样:
public static class ModalBox extends DialogFragment {
EditProfileModalBoxInterface mListener;
// Container Activity must implement this interface
public interface EditProfileModalBoxInterface {
void onFinishEditProfile( HashMap<String, String> dataPassing );
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (EditProfileModalBoxInterface) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement EditProfileModalBoxInterface");
}
}
}
然后调用mListener。onFinishEditProfile(..) 在DialogFragment类中需要它的地方。
这样,您将在活动类中收到返回的结果,从中可以调用所需片段的相关方法,将结果传递给该片段。
这里已经描述了整个流程
考虑使用eventBus,例如Otto
用法非常简单。您需要做的就是创建一个evenbus:
public static Bus bus = new Bus(ThreadEnforcer.MAIN); //use Dagger2 to avoid static
然后创建一个接收方方法(在您的案例中,在片段2中):
@Subscribe
public void getMessage(String s) {
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
通过致电(来自DialigFrament)向您发送消息:
bus.post("Hello");
不要忘记在(片段的)onCreate方法中注册eventBus:
bus.register(this);
就是这样!
这是一个示例DialogFragment,用于向所选联系人发送消息。我还需要捕获DialogFragment上的click事件并重定向。
理想的实现这一点这是需要做的
public class SMSDialogFrag extends DialogFragment {
private static String one="one";
private EditText messageContent;
private AlertDialog dialog;
private String mobNumber;
public static SMSDialogFrag showDialog(String mobNumber){
SMSDialogFrag customDialogFrag=new SMSDialogFrag();
Bundle bundle=new Bundle();
bundle.putString(one, mobNumber);
customDialogFrag.setArguments(bundle);
return customDialogFrag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.sms_dialog, null);
alertDialogBuilder.setView(view);
setupUI(view);
alertDialogBuilder.setTitle("");
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Do nothing here because we override this button later
}
});
alertDialogBuilder.setPositiveButton("Send", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Do nothing here because we override this button later
}
});
dialog = alertDialogBuilder.create();
dialog.show();
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
//else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
}
});
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();//IN YOUR USE CASE YOU CAN REDIRECT TO YOUR CALLER FRAGMENT
}
});
return dialog;
}
void setupUI(View view){
TextView textViewMob=(TextView)view.findViewById(R.id.mobNumber);
messageContent=(EditText)view.findViewById(R.id.messageContent);
mobNumber=getArguments().getString(one);
textViewMob.setText("Send message to : "+mobNumber);
}
void sendMessage(){
if( ! TextUtils.isEmpty(messageContent.getText())){
try {
SmsManager smsManager = SmsManager.getDefault();
Log.v(Constants.UI_LOG,"Number >>>>>>> "+mobNumber);
smsManager.sendTextMessage(mobNumber, null, messageContent.getText().toString(), null, null);
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(getActivity(),"Message Sent!",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}else{
Toast.makeText(getActivity(),"Please enter message to send!",Toast.LENGTH_SHORT).show();
}
}
}
问题内容: 我想显示一个灯箱,其内容由ng-show显示,但是我不知道如何触发灯箱JS。我正在寻找类似的东西 问题答案: 我认为,最好监视绑定ng- show的模型。 这是示例: 和小提琴
我有个奇怪的问题引起了冲突。我不得不切换到本机的来修复它,但是它有bug。 我最初的问题是:我有一个带有要在我的一个片段中请求权限,我调用提示显示得很好,但当我接受或拒绝权限时,什么也不会发生。从不调用回调。相反,它在我的片段所附加的活动中被调用。对我无用,我需要回调在片段中工作。 考虑到这一点,我被告知需要使用,但这只适用于,因此我将导航抽屉更改为使用本机片断,而不是使用v4支持库片断。但是,因
问题内容: 我有一个简单的程序,其中显示了一些项目的列表,单击其中的一个后,单击的项目将传递回附件。当用户取消对话框时,我还想执行一些默认处理(使用 后退按钮 )-更具体地说,在这种情况下,我想向活动传递一个空字符串。 但是,如果将对话框放在(来自 兼容性包 )中, 则使用后退按钮关闭对话框时不会调用 。我究竟做错了什么? 问题答案: 这可能与您的代码中没有显式调用的事实有关。该OnCancelL
从我的中,每个项目中都有多个按钮,我想要的是在单击,并在单击。 问题是我不知道如何才能或如何才能实现一个回调时被点击,并可以执行不同的方法或操作根据什么按钮是点击每个项目。 在我的适配器类上 这是我的DialogFragment类
我的要求: 发现错误: 在这一行中..为什么值不显示在mainfragment中??
那么DialogFragments有什么特别之处呢?为什么在显示对话框时没有暂停调用片段?又如何实现呢? 我在文档中没有发现任何关于这种行为的引用,所以引用是一个加号。