আমি আমার অ্যাপ্লিকেশনটির জন্য একটি কাস্টম সংলাপ প্রয়োগ করেছি। আমি এটি প্রয়োগ করতে চাই যখন ব্যবহারকারী ডায়ালগের বাইরে ক্লিক করেন, ডায়ালগটি বাতিল হয়ে যাবে। এর জন্য আমার কী করতে হবে?
আমি আমার অ্যাপ্লিকেশনটির জন্য একটি কাস্টম সংলাপ প্রয়োগ করেছি। আমি এটি প্রয়োগ করতে চাই যখন ব্যবহারকারী ডায়ালগের বাইরে ক্লিক করেন, ডায়ালগটি বাতিল হয়ে যাবে। এর জন্য আমার কী করতে হবে?
উত্তর:
আপনি dialog.setCanceledOnTouchOutside(true);
যদি ডায়ালগের বাইরে স্পর্শ করেন তবে ডায়ালগটি বন্ধ করবে এমনটি আপনি ব্যবহার করতে পারেন ।
কিছুটা এইরকম,
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);
অথবা যদি আপনার ডায়লগটি নন-মডেল করে থাকে তবে,
1 - FLAG_NOT_TOUCH_MODAL
আপনার ডায়ালগের উইন্ডো বৈশিষ্ট্যের জন্য পতাকাটি সেট করুন
Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
2 - উইন্ডোজের বৈশিষ্ট্যে অন্য পতাকা যুক্ত করুন, FLAG_WATCH_OUTSIDE_TOUCH
- - এটির দৃশ্যমান অঞ্চলের বাইরে স্পর্শ ইভেন্ট পাওয়ার জন্য এটি একটি ডায়ালগের জন্য।
3 - onTouchEvent()
সংলাপের ওভাররাইড এবং ক্রিয়া প্রকারের জন্য পরীক্ষা করুন। যদি অ্যাকশন ধরণের ' MotionEvent.ACTION_OUTSIDE
' এর অর্থ হয়, ব্যবহারকারী ডায়ালগ অঞ্চলের বাইরে ইন্টারঅ্যাক্ট করছে। সুতরাং এই ক্ষেত্রে, আপনি আপনার কথোপকথনটি হ্রাস করতে পারেন বা আপনি কী করতে চান তা সিদ্ধান্ত নিতে পারেন। প্লেইনপ্রিন্ট দেখুন?
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
System.out.println("TOuch outside the dialog ******************** ");
this.dismiss();
}
return false;
}
আরও তথ্যের জন্য কীভাবে টাচ পয়েন্টের উপর ভিত্তি করে একটি কাস্টম ডায়ালগ খারিজ করবেন? এবং আপনার অ-মডেল ডায়ালগটিকে কীভাবে খারিজ করবেন, যখন বাইরের ডায়ালগের অঞ্চলে স্পর্শ করা হয়
সহজভাবে ব্যবহার
dialog.setCanceledOnTouchOutside(true);
আপনি অন টাচ এভেন্টের এই প্রয়োগটি ব্যবহার করতে পারেন। এটি টাচ ইভেন্টে ক্রিয়াকলাপের নীচে প্রতিক্রিয়া দেওয়া থেকে বাধা দেয় (যেমন হুয়েটল উল্লিখিত হয়েছে)।
@Override
public boolean onTouchEvent ( MotionEvent event ) {
// I only care if the event is an UP action
if ( event.getAction () == MotionEvent.ACTION_UP ) {
// create a rect for storing the window rect
Rect r = new Rect ( 0, 0, 0, 0 );
// retrieve the windows rect
this.getWindow ().getDecorView ().getHitRect ( r );
// check if the event position is inside the window rect
boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
// if the event is not inside then we can close the activity
if ( !intersects ) {
// close the activity
this.finish ();
// notify that we consumed this event
return true;
}
}
// let the system handle the event
return super.onTouchEvent ( event );
}
সূত্র: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html
অথবা, আপনি যদি আপনার স্টাইলের এক্সএমএল সংজ্ঞায়িত কোনও থিম ব্যবহার করে কথোপকথনটি কাস্টমাইজ করছেন তবে এই থিমটিতে এই লাইনটি রাখুন:
<item name="android:windowCloseOnTouchOutside">true</item>
dialog.setCanceledOnTouchOutside(true);
আশ্চর্যজনকভাবে কাজ করে।
এই পদ্ধতির ধূসর অঞ্চলের নীচের ক্রিয়াকলাপগুলি ক্লিক ইভেন্টগুলি পুনরুদ্ধার করা সম্পূর্ণভাবে এড়ানো উচিত।
আপনার যদি এই লাইনটি থাকে তবে এটি সরান :
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
আপনার তৈরি করা ক্রিয়াকলাপ এ রাখুন
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
তারপরে এটির সাথে স্পর্শ ইভেন্টটিকে ওভাররাইড করুন
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
displayYourDialog();
return false; // stop activity closing
}
}
// Touch events inside are fine.
return super.onTouchEvent(ev);
}
এই কোডটি যখন ডায়ালগবক্সে সেই সময় হাইডসফটিনপুট ক্লিক করুন এবং ব্যবহারকারীরা যখন ডায়ালগবক্সের বাইরের দিকে ক্লিক করেন তখন সফটিনপুট এবং ডায়ালগবক্স উভয়ই কাছে থাকে for
dialog = new Dialog(act) {
@Override
public boolean onTouchEvent(MotionEvent event) {
// Tap anywhere to close dialog.
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) event.getX(),
(int) event.getY())) {
// You have clicked the grey area
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
dialog.dismiss();
// stop activity closing
} else {
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
}
return true;
}
};
আর একটি সমাধান, এই কোডটি অ্যান্ড্রয়েড উত্স কোড থেকে নেওয়া হয়েছিল Window
আপনার ডায়ালগ উত্স কোডে এই দুটি পদ্ধতি যুক্ত করা উচিত।
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) {
hide();
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
এই সমাধানটিতে এই সমস্যা নেই:
নীচের ক্রিয়াকলাপটি টাচ ইভেন্টেও প্রতিক্রিয়া ব্যতীত এটি দুর্দান্ত কাজ করে। এটি রোধ করার কোনও উপায় আছে? - howettl
নিম্নলিখিতটি আমার পক্ষে কাজ করেছে:
myDialog.setCanceledOnTouchOutside(true);
কোডটি এখানে
dialog.getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
dialog. getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
UiUtils.hideKeyboard2(getActivity());
return false; // stop activity closing
}
}
getActivity().dispatchTouchEvent(ev);
return false;
}
});
আর একবার চেষ্টা কর . আপনি বাইরে স্পর্শ করলে আপনি কীবোর্ডটি আড়াল করতে পারেন