Как заблокировать событие щелчка на фоне DialogFragment вокруг кнопки Samsung S9 Edge

У меня есть требование к пользовательскому интерфейсу, показывающее блокирующий DialogFragment, который нельзя отклонить, щелкнув фон. Кроме того, когда отображается DialogFragment, нельзя щелкнуть ни одно представление под ним.

Things are working well except on the Samsung S9 device.

На Samsung S9, у которого есть крайняя кнопка, при щелчке по краю краевой кнопки щелкается представление под DialogFragment и выполняется событие, что не так, как ожидалось.

Вот пример кода:

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();
        }
    });
}

}

Макет довольно прост, просто LinearLayout с кнопкой внутри. При нажатии кнопки открывается диалоговое окно блокировки. Идентификатор LinearLayout - это фон, который не следует щелкать после отображения диалогового окна.

Код диалога:

открытый класс MyDialogFragment расширяет DialogFragment { общедоступный статический финал String TAG = "Dialog";

@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();
}

}

Но теперь, когда отображается диалоговое окно, щелкните область на краевой кнопке, можно ввести фоновый прослушиватель щелчков, я могу получить журнал и тост.

Как этого избежать?

1
0
207
2

Ответы 2

setcancelable (ложь); можно использовать для блокировки нажатия на фон до завершения задачи

Я уже установил его (см. Код в onCreate). Он работает на других устройствах, но не может блокировать сенсорную область вокруг кнопки samsung s9 edge.

Dandan Meng 18.10.2018 09:32

В случае стрельбы я бы сделал

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

Другие вопросы по теме