在返回点击或触摸外部时,取消BottomSheetDialogFragment



我有一个问题与我的BottomSheetDialogFragment,其中我可以取消它与触摸外部或向后点击,但如果我关闭应用程序并重新打开它,然后那些我已经取消重新出现。

我已经尝试在onCreateView中添加取消的触摸外部,但这没有帮助:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.new_item, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().setCancelable(true);
getDialog().setCanceledOnTouchOutside(true);
return view;
}

感谢任何想法!我有一种感觉,这与解雇有关,但我不确定。

完整代码是:


public class AddNewItem extends BottomSheetDialogFragment {
public static final String TAG = "ActionBottomDialog";
private EditText newItemText;
private Button newItemSaveButton;
private DatabaseHandler db;
public static AddNewItem newInstance(){
return new AddNewItem();
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setStyle(STYLE_NORMAL, R.style.DialogStyle);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.new_item, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().setCancelable(true);
getDialog().setCanceledOnTouchOutside(true);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
newItemText = getView().findViewById(R.id.newItemText);
newItemSaveButton = getView().findViewById(R.id.newItemButton);
db = new DatabaseHandler(getActivity());
db.openDatabase();
// changes whether updating a task or not
boolean isUpdate = false;
final Bundle bundle = getArguments();
if(bundle != null){
isUpdate = true;
String item = bundle.getString("item");
newItemText.setText(item);
if(item.length()>0){
newItemSaveButton.setTextColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));
}
}
newItemText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
if (s.toString().equals("")) {
newItemSaveButton.setEnabled(false);
newItemSaveButton.setTextColor(Color.GRAY);
}
else{
newItemSaveButton.setEnabled(true);
newItemSaveButton.setTextColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
final boolean finalIsUpdate = isUpdate;
newItemSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
String text = newItemText.getText().toString();
if(finalIsUpdate){
db.updateItem(bundle.getInt("id"), text);
}
else{
ShoppingModel item = new ShoppingModel();
item.setItem(text);
item.setStatus(0);
db.insertItem(item);
}
dismiss();
}
});
}

@Override
public void onDismiss(DialogInterface dialog){
Activity activity = getActivity();
if(activity instanceof DialogCloseListener){
((DialogCloseListener)activity).handleDialogClose(dialog);
}
}
}

如果你想防止在应用程序关闭和重新打开后重新显示BottomSheetDialogFragment,你需要在onCreateView方法中处理保存的实例状态,并检查片段之前是否已被取消。如果有,你可以简单地从onCreateView方法返回null,以防止片段再次显示。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
if (savedInstanceState != null && savedInstanceState.getBoolean("is_cancelled")) {
return null;
}
View view = inflater.inflate(R.layout.new_item, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().setCancelable(true);
getDialog().setCanceledOnTouchOutside(true);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("is_cancelled", true);
}

通过重写onCancel:

解决了这个问题
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
dismiss();
}

From: Detect back button but don't dismiss dialogfragment

并且通过在onViewCreated中为外部触摸添加一个on click侦听器:

View touchOutsideView = getDialog()
.getWindow()
.getDecorView()
.findViewById(com.google.android.material.R.id.touch_outside);
touchOutsideView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});

最新更新