如何阻止单击事件到三星S9 Edge按钮周围的对话片段背景



我有一个UI要求,显示一个阻塞的DialogFragment,不能通过单击背景来消除。 此外,当对话框片段显示时,无法单击其下的任何视图。

除了三星S9设备外,一切运行良好。

在具有边缘按钮的三星 S9 上,单击边缘按钮的边缘时,单击对话框片段下的视图并执行事件,这与预期不符。

下面是一个示例代码:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialogFragment myDialogFragment = new MyDialogFragment();
myDialogFragment.show(getSupportFragmentManager(), MyDialogFragment.TAG);
}
});
findViewById(R.id.background).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("wrong", "clicked!!!!---------------");
Toast.makeText(MainActivity.this, "Click!", Toast.LENGTH_LONG).show();
}
});
}

}

布局非常简单,只是一个带有按钮的线性布局。 单击按钮将显示阻止对话框。 线性布局 id 是背景,在对话框显示后不应单击它。

对话框代码:

public class MyDialogFragment extensions DialogFragment { 公共静态最终字符串 TAG = "对话框";

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_dialog_layout, container, false);
getDialog().setCanceledOnTouchOutside(false);
return view;
}
@Override
public void onResume() {
Window window = getDialog().getWindow();
Point size = new Point();
Display display = window.getWindowManager().getDefaultDisplay();
display.getSize(size);
window.setLayout((int) (size.x * 0.8), WindowManager.LayoutParams.WRAP_CONTENT);
window.setGravity(Gravity.CENTER);
super.onResume();
}

}

但是现在当对话框显示时,单击边缘按钮上的区域,可以输入背景单击侦听器,我可以获取日志和吐司。

如何预防这种情况?

如果正在开火,我会这样做

Fragment currentFrag = getSupportFragmentManager().findFragmentByTag(MyDialogFragment_TAG);
if (!(currentFrag instanceof MyDialogFragment))
{
// your code for when you're dialog fragment is not visible
}

setcancelable(false(;可用于阻止单击背景,直到任务完成

为根节点指定一个 id

<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/constraintlayoutRoot"

添加一个空的 OnClickListener

public View onCreateView(...) {
View view = _inflater.inflate(R.layout.fragment_xyz, _container, false);
view.findViewById(R.id.constraintlayoutRoot).setOnClickListener(view1 -> {
});

最新更新