gpt4 book ai didi

android - BottomSheetDialogFragment - 听用户事件解除

转载 作者:IT老高 更新时间:2023-10-28 23:29:42 29 4
gpt4 key购买 nike

如何收听 BottomSheetDialogFragment 的最终解除?我只想在最终解雇时保存用户更改...

我尝试了以下操作:

方法一

只有在通过向下滑动对话框(不是在后按或触摸外部)关闭对话框时才会触发

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Dialog d = super.onCreateDialog(savedInstanceState);
d.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {

BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet);

BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet);
behaviour.setState(BottomSheetBehavior.STATE_EXPANDED);
behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN)
{
// Bottom Sheet was dismissed by user! But this is only fired, if dialog is swiped down! Not if touch outside dismissed the dialog or the back button
Toast.makeText(MainApp.get(), "HIDDEN", Toast.LENGTH_SHORT).show();
dismiss();
}
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {

}
});
}
});
return d;
}

方法二

这让我无法区分最终解雇和来自屏幕旋转或 Activity 娱乐的解雇...

 @Override
public void onDismiss(DialogInterface dialog)
{
super.onDismiss(dialog);
// this works fine but fires one time too often for my use case, it fires on screen rotation as well, although this is a temporarily dismiss only
Toast.makeText(MainApp.get(), "DISMISSED", Toast.LENGTH_SHORT).show();
}

问题

如何收听表明用户已完成对话的事件?

最佳答案

虽然关于 SO 的所有类似问题都建议使用 onDismiss 我认为以下是正确的解决方案:

@Override
public void onCancel(DialogInterface dialog)
{
super.onCancel(dialog);
Toast.makeText(MainApp.get(), "CANCEL", Toast.LENGTH_SHORT).show();
}

如果发生以下情况,则会触发:

* the user presses back
* the user presses outside of the dialog

这不会触发:

* on screen rotation and activity recreation

解决方案

结合 onCancelBottomSheetBehavior.BottomSheetCallback.onStateChanged,如下所示:

public class Dailog extends BottomSheetDialogFragment
{
@Override
public void onCancel(DialogInterface dialog)
{
super.onCancel(dialog);
handleUserExit();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Dialog d = super.onCreateDialog(savedInstanceState);
d.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet);
behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN)
{
handleUserExit();
dismiss();
}
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {

}
});
}
});
return d;
}

private void handleUserExit()
{
Toast.makeText(MainApp.get(), "TODO - SAVE data or similar", Toast.LENGTH_SHORT).show();
}
}

关于android - BottomSheetDialogFragment - 听用户事件解除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616833/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com