পপআপ উইন্ডো - বাইরে ক্লিক করার পরে বরখাস্ত করুন


94

আমার ক্রিয়াকলাপে আমার একটি পপআপ উইন্ডো রয়েছে, জিনিসটি আমার পপআপওয়াইন্ডো এখনও দেখায় এমনকি যখন আমি আমার ক্রিয়াকলাপের সাথে ইন্টারঅ্যাক্ট করছি (আমার তালিকায় স্ক্রোলিং বলুন)। আমি আমার তালিকার মাধ্যমে স্ক্রোল করতে পারি এবং পপআপ উইন্ডো এখনও আছে।

আমি যেটি অর্জন করতে চাই তা যখন আমি পর্দা উইন্ডো না পর্দাতে স্ক্রোলিং / ক্লিক / ইত্যাদি স্পর্শ করছি / আমি পপআপ উইন্ডো খারিজ করতে চাই। ঠিক কীভাবে একটি মেনু কাজ করে। আপনি যদি মেনুটির বাইরে ক্লিক করেন তবে মেনুটি খারিজ হয়ে যাবে।

আমি চেষ্টা করেছি setOutsideTouchable(true)কিন্তু এটি উইন্ডোটি খারিজ করবে না। ধন্যবাদ

উত্তর:


130

আপনি যদি এটির বাইরে স্পর্শ করেন তবে দয়া করে এটি সেট setBackgroundDrawableকরার চেষ্টা করুন PopupWindowthe


4
আমি এটা মিস করেছি আপনি কি নিজের পপআপ উইন্ডোতে সেটব্যাকগ্রাউন্ডড্রেইবল ব্যবহার করছেন? আমি জানি যে ব্যাকগ্রাউন্ডটি শূন্য করার জন্য নির্ধারণ করা অনটচলাইস্টারকে মেরে ফেলেছে
মার্সিন এস।

31
এটাই! থ্যানেক্স ম্যান! এই ক্ষেত্রে, এমনকি স্পর্শ ইভেন্টগুলি সঠিকভাবে পরিচালনা করা যায়। পপআপ উইন্ডো.সেটআউটসাইড টাচ্যাবল (সত্য); popupWindow.setTouchable (সত্য); পপআপ উইন্ডো.সেটব্যাকগ্রাউন্ডড্রোয়েবল (নতুন বিটম্যাপড্রেবল ()); popupWindow.setTouchInterceptor (new OnTouchListener () {@ ওভাররাইড পাবলিক বুলিয়ান অন টাচ (দেখুন ভি, মোশনইভেন্ট ইভেন্ট) {যদি (AppContext.isDebugMode ()) লগ.ডি ("পপআপ_উইন্ডডো", "ভি:" + + ভি.জিটিটি | ইভেন্ট: "+ ইভেন্ট.getAction ()); পপআপ উইন্ডো.ডিজমিস (); সত্য সত্য;}});
বিয়ারসটার্ম

4
পটভূমি অঙ্কনযোগ্য স্থানে সেট করা আমার পক্ষে কাজ করে না। অন্য কারও যদি সমস্যা থাকে তবে আমার উত্তর দেখুন।
এমপিলেগ্রার

4
@ ওয়ারিনিঞ্জ, আপনার মন্তব্য কাজ করেছে! হতে পারে আপনি এই ক্যুইজিটনে একটি পুরো উত্তরদাতাকে আরও ভালভাবে ছেড়ে দিতে পারেন, এটি অন্যদের জন্য উপকারী হবে
এন্টন কিজেমা

4
@ ওয়ারেনিনজা BitmapDrawable()চিত্রিত হয়েছে। ColorDrawable()পরিবর্তে ব্যবহার করুন।
শ্রুজান বড়াই

126

আমি দেখতে পেয়েছি যে সরবরাহ করা উত্তরগুলি আমার পক্ষে কার্যকর হয়নি, গ্রহণযোগ্য উত্তর সম্পর্কে ওয়ারেননিজার মন্তব্য ছাড়াও, এবং মার্সিন এস এর সম্ভবত কাজ করবে। আমার পক্ষে কাজ করা অংশটি এখানে:

myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);

বিকল্পভাবে:

myPopupWindow.setFocusable(true);

পার্থক্যগুলি কী তা নিশ্চিত নয়, তবে সেটপোডওয়াইন্ডো উত্স কোডটি পরে আধুনিক ব্যবহার করে যখন সেটডমডালের সাথে যখন এটির মড্যালিটিটি সত্য হয়ে যায় তখন কমপক্ষে অ্যান্ড্রয়েড বিকাশকারীরা এটিকে একটি কার্যকর পদ্ধতি হিসাবে বিবেচনা করে এবং এটি কেবল একটি লাইন।


6
তোমাকে অনেক ধন্যবাদ. অন্য কোনও উত্তরই আমার পক্ষে কাজ করেনি বা এটিকে যথেষ্ট পরিমাণে ব্যাখ্যা করেছে। দ্বিতীয় বিকল্পটি যদিও আমার পক্ষে কাজ করছে না।
জেডিএন

4
এছাড়াও আমি নোট করছি যে বিটম্যাপড্র্যাবেবল অবমূল্যায়িত। সমস্যার আসল সমাধান পেয়ে ভাল লাগবে, কারণ এগুলি দেখতে অস্থায়ী কর্মক্ষেত্রের মতো দেখতে নতুন এপিআই সংস্করণগুলিতে সমর্থন করার গ্যারান্টিযুক্ত নয়।
HAL9000

বিটম্যাপড্রেবলযোগ্য অবহেলিত কনস্ট্রাক্টর ব্যবহার না করতে এখানে উল্লেখ করুন: stackoverflow.com/a/21680637/2048266 । পপআপ উইন্ডো.সেটব্যাকগ্রাউন্ডড্রোয়েবল (নতুন বিটম্যাপড্রেইবল (getRes উত্স (), ""));
মনোনীত

বিকল্প পদ্ধতিটি ব্যবহার করার সময় setFocusable, আমাদের দু'বার বোতামটি ক্লিক করতে হবে (যেখানে বোতামটি পপ-আপের বাইরে রাখা হয়েছে) যেখানে প্রথম পদ্ধতিতে এটি দুর্দান্ত কাজ করে :)
জয় রেক্স

BitmapDrawable()বর্ণিত হয়। ColorDrawable()পরিবর্তে ব্যবহার করুন।
শ্রুজান বড়াই

61

আমি একই সমস্যাগুলির সাথে মিলিত হয়েছি এবং এটি নীচের কোডগুলির মতো স্থির করেছি। এটা আমার জন্য ভালই কাজ করে।

    // Closes the popup window when touch outside.
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setFocusable(true);
    // Removes default background.
    mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

বিটিডাব্লু, বিটম্যাপড্রেবলযোগ্য অবহেলিত কনস্ট্রাক্টর ব্যবহার করবেন না, ডিফল্ট ব্যাকগ্রাউন্ড প্রতিস্থাপন করতে এই নতুন কালারড্রেবল (android.R.color.transparent) ব্যবহার করুন ।

আনন্দ কর@.@


4
আপনার পপউপ উইন্ডো
সেন্সারসায়ান

যদি পপআপের ফোকাসের প্রয়োজন না হয় তবে আমার কি সত্যিই সত্যকে ফোকাসযোগ্য সেট করতে হবে?
লেভোর

আমি আশ্চর্য হয়েছি যে এটি কাজ করে, তবে এটি 21 এআইপি-তে প্রয়োজনীয় This এটি আমার পপআপ উইন্ডোটি ভুলভাবে অ্যানিমেট করছিল।
এপিকপান্ডাফোরস

24

আমি জানি এটি দেরী হয়েছে তবে আমি লক্ষ্য করেছি যে পপআপ উইন্ডোতে লোকেরা এখনও একটি সমস্যা আছে। আমি একটি সম্পূর্ণ কার্যকারী উদাহরণ লেখার সিদ্ধান্ত নিয়েছি যেখানে আপনি পপআপ উইন্ডোটির বাইরে ছোঁয়া বা ক্লিক করে বা কেবল উইন্ডোটি নিজেই স্পর্শ করে খারিজ করতে পারেন। এটি করতে একটি নতুন পপআপ উইন্ডো শ্রেণি তৈরি করুন এবং এই কোডটি অনুলিপি করুন:

পপআপ উইন্ডো.ক্লাস

public class PopupWindow extends android.widget.PopupWindow
{
Context ctx;
Button btnDismiss;
TextView lblText;
View popupView;

public PopupWindow(Context context)
{
    super(context);

    ctx = context;
    popupView = LayoutInflater.from(context).inflate(R.layout.popup, null);
    setContentView(popupView);

    btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss);
    lblText = (TextView)popupView.findViewById(R.id.text);

    setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    setWidth(WindowManager.LayoutParams.WRAP_CONTENT);

    // Closes the popup window when touch outside of it - when looses focus
    setOutsideTouchable(true);
    setFocusable(true);

    // Removes default black background
    setBackgroundDrawable(new BitmapDrawable());

    btnDismiss.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v) {


         dismiss();
        }});

    // Closes the popup window when touch it
/*     this.setTouchInterceptor(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                dismiss();
            }
            return true;
        }
    }); */   
   } // End constructor

   // Attaches the view to its parent anchor-view at position x and y
   public void show(View anchor, int x, int y)
   {
      showAtLocation(anchor, Gravity.CENTER, x, y);
   }
}

এখন পপআপ উইন্ডোটির জন্য বিন্যাসটি তৈরি করুন: পপআপ.এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout     
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="1dp"
    android:orientation="vertical"
    android:padding="10dp" >

<TextView 
    android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"  
    android:gravity="center" 
    android:padding="5dp" 
    android:text="PopupWindow Example"
    android:textColor="#000000" 
    android:textSize="17sp" 
    android:textStyle="italic" />

<FrameLayout
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical">

    <Button
        android:id="@+id/btn_dismiss" 
        style="?android:attr/buttonStyleSmall" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Dismiss" 
        android:visibility="gone" />

    <TextView
        android:id="@+id/lbl_dismiss"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Touch outside of this box to dismiss"
        android:textColor="#ffffff"
        android:textStyle="bold" />

</FrameLayout>      

আপনার প্রধান ক্রিয়াকলাপে পপআপ উইন্ডো শ্রেণীর একটি উদাহরণ তৈরি করুন:

final PopupWindow popupWindow = new PopupWindow(this);
popupWindow.show(findViewById(R.id.YOUR_MAIN_LAYOUT), 0, -250);

যেখানে YOUR_MAIN_LAYOUT হ'ল বর্তমান ক্রিয়াকলাপের বিন্যাস যা পপআপ উইন্ডো পপ আপ হবে


4
ধন্যবাদ - এটি আমার পক্ষে কাজ করেছে। কেবলমাত্র একটি ছোট নোটটি আপনার কাস্টম ক্লাসের জন্য পপআপ উইন্ডো ব্যতীত অন্য কোনও নাম ব্যবহার করা, সম্ভবত পপআপ উইন্ডোর পরিবর্তে এটিকে মাইপপআপ উইন্ডো বলুন যাতে অ্যান্ড্রয়েড আপনার মানক অ্যান্ড্রয়েড বর্গ এবং আপনার কাস্টম শ্রেণীর মধ্যে বিভ্রান্ত না হয়।
সাইমন

@ মার্সিন এস। সন্ধানভায়ু বাইআইডি (আর। আইডি। YOUR_MAIN_LAYOUT) ?? এটি কি আর.লাইআউট হবে। আমার_লাউআউট
কুমার জাইসানসারিয়া

@ সিমন সন্ধান করুন ভিউবিআইআইডি (আর। আইডি। YOUR_MAIN_LAYOUT) ?? এটি কি আর.লেআউটআউট হবে? আমার_লাআউট?
অঙ্কেশ কুমার জাইসানসারিয়া

15

@ লুনাকং এর উত্তর এবং @ আওয়ারগ্লাসের নিশ্চিতকরণের জন্য ধন্যবাদ আমি একটি সদৃশ মন্তব্য করতে চাই না, তবে কেবল এটি পরিষ্কার এবং সংক্ষিপ্ত করতে চাই।

// Closes the popup window when touch outside. This method was written informatively in Google's docs.
mPopupWindow.setOutsideTouchable(true);

// Set focus true to prevent a touch event to go to a below view (main layout), which works like a dialog with 'cancel' property => Try it! And you will know what I mean.
mPopupWindow.setFocusable(true);

// Removes default background.
mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

এমটিডিট্যাট


আমি এর বাইরে ক্লিক করে পপআপ উইন্ডোটি বন্ধ করতে সক্ষম হতে চেয়েছিলাম, কিন্তু যখন আমি এটি করতাম তখন নীচের দর্শনগুলি (পপআপ উইন্ডোর অংশ নয়, তবে ক্রিয়াকলাপের অংশ) ক্লিক করা হচ্ছিল। সেটফোকাসবাল (সত্য) আমি যা খুঁজছিলাম তা ছিল। ধন্যবাদ!
হেলানড্র্রুউ

@ হেলানড্রু, এটি আপনাকে সহায়তা করে খুশী, :)
ট্যান ডেট

8

একটি জন্য ListPopupWindowসেট উইন্ডোতে একটি মোডাল যখন দেখানো যাবে।

mListPopupWindow.setModal(true);

এইভাবে, ListPopupWindowবাদ পড়ার বাইরে ক্লিক করলে তা বরখাস্ত হবে।


ধন্যবাদ, আমি এই সন্ধান করছি। এটি কেবল তালিকার বাইরে ছোঁয়ার পরে তালিকার পপ উইন্ডোকে বরখাস্তযোগ্য সেট করে না, তবে তালিকার ইভেন্টটি তালিকার পপ উইন্ডোর পাশে থাকা অন্যান্য দর্শনেও পাস করে না। আমি মরিয়া হয়ে এটি খুঁজছিলাম কারণ আমার ক্ষেত্রে তালিকার বাইরের তালিকাটি স্পর্শ করা ঘটনাটি পুনর্ব্যবহারের দিকে যাচ্ছিল যা নীচের তালিকায় থাকা তালিকার অপসারণের পাশে ছিল এবং পুনর্ব্যবহারযোগ্য আইটেমটি নির্বাচিত হচ্ছে যা আমি চাইনি।
শঙ্কর_ভিএল

mListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);অন-স্ক্রীন কীবোর্ডে পপআপ উইন্ডো হস্তক্ষেপ রোধ করতে আপনার প্রয়োজনও হতে পারে ।
মিস্টার-আইডিই

6

লক্ষ করুন যে এটি বাতিল popupWindow.setOutsideTouchable(true)করার জন্য আপনাকে wrap_contentনীচের কোডের মতো প্রস্থ এবং উচ্চতা তৈরি করতে হবে :

PopupWindow popupWindow = new PopupWindow(
            G.layoutInflater.inflate(R.layout.lay_dialog_support, null, false),
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT, true);

popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
popupWindow.showAtLocation(view, Gravity.RIGHT, 0, 0);

5
  popupWindow.setTouchable(true);
  popupWindow.setFocusable(true);
  popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

স্ক্রিনে ক্লিক / টাচ করার সময় এটি পপআপ উইন্ডোকে বরখাস্ত করবে showএটি নিশ্চিত করুন যে আপনি শোএলটোকেশনের আগে ফোকাসযোগ্য সত্য সেট করেছেন।


4
এটি কীভাবে জিজ্ঞাসিত প্রশ্নের সঠিক উত্তর সরবরাহ করে তা ব্যাখ্যা করার জন্য কিছু ব্যাখ্যামূলক পাঠ্য যুক্ত করুন। ধন্যবাদ
পরকীয়া

ধন্যবাদ! ShowAtLocation () কল করার আগে আপনাকে সেটারদের কল করতে হবে।
droid256

5

বাইরে স্পর্শ করার সময় আপনি পপআপ উইন্ডোটি দ্রবীভূত করতে isOutsideTouchable OR ব্যবহার করতে পারেনisFocusable

popupWindow.isOutsideTouchable = true // dismiss popupwindow when touch outside

popupWindow.isFocusable = true // dismiss popupwindow when touch outside AND when press back button

বিঃদ্রঃ

  • বর্তমানে, পরীক্ষার পরে আমি দেখছি পপআপ উইন্ডো খারিজ করতে আমাদের সহায়তা করবে setBackgroundDrawable না

  • যদি আপনি PopupWindow( PopupWindow->PopupDecorView->dispatchKeyEventএবং PopupWindow->PopupDecorView->onTouchEvent) খারিজের জন্য কোডটি দেখেন । আপনি দেখতে পাবেন যে যখন পিছনে বোতাম টিপুন, তখন তারা খারিজ করে দেয় ACTION_UPএবং যখন বাইরে স্পর্শ করে তারা অন ACTION_UPবা বাতিল করে দেয়ACTION_OUTSIDE



4

@ লুনা কং এর পরামর্শ কাজটি কবজির মতো।

তবে এমপপআপ উইন্ডো.সেটফোক্সেবল (মিথ্যা) সেট আপ করা হচ্ছে। পপআপ উইন্ডো অদৃশ্য হয়ে যাওয়ার জন্য প্রয়োজনীয় অপ্রয়োজনীয় স্পর্শ সরিয়ে দেয়।

উদাহরণস্বরূপ: আসুন স্ক্রিনে একটি পপ আপ উইন্ডো দৃশ্যমান বিবেচনা করুন এবং আপনি একটি বোতাম ক্লিক করতে চলেছেন। সুতরাং এই ক্ষেত্রে, (যদি mpopwindow.setFocusable (সত্য)) একটি বোতাম পপআপ উইন্ডো প্রথম ক্লিকে বরখাস্ত করা হবে। বাটনটি কাজ করতে আপনাকে আবার ক্লিক করতে হবে। যদি ** (mpopwindwo.setFocusable (মিথ্যা)) ** একক বোতামের বোতাম পপআপ উইন্ডো বরখাস্ত করার পাশাপাশি বাটন ক্লিকটি ট্রিগার করে Hope আশা করি এটি সহায়তা করবে helps


4
অনেক ধন্যবাদ! আমি ঠিক একই সন্ধান করছিলাম
গণেশ

3

উইন্ডো ব্যাকগ্রাউন্ড স্বচ্ছ সেট করুন:

PopupWindow.getBackground().setAlpha(0);

এটি আপনার পটভূমি বিন্যাসে সেট করার পরে। ঠিকভাবে কাজ করে.


4
getBackground () নাল হতে পারে।
জ্যারেড রুম্মার

1

কিছু ক্ষেত্রে পপআপকে ফোকাসযোগ্য করে তোলা বাঞ্ছনীয় নয় (যেমন আপনি এটি অন্য ভিউ থেকে ফোকাস চুরি করতে চান না)।

একটি বিকল্প পদ্ধতির একটি টাচ ইন্টারসেপ্টার ব্যবহার করা হয়:

popupWindow.setOutsideTouchable(true);
popupWindow.setTouchInterceptor(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            popupWindow.dismiss();
        }
        return false;
    }
});

1

যদি এই পপআপ উইন্ডোটি অন্য ক্রিয়াকলাপ হয় এবং আপনি এর স্ক্রিনটি মূল স্ক্রিনে হ্রাস করেছেন এবং আপনি বাইরের অঞ্চলটি সক্ষম বা অক্ষম করতে চান y আপনি কেবল এই কোড দ্বারা বাইরের অঞ্চল সক্ষম বা অক্ষম করতে পারেন:

সক্ষম করুন:

YourActivity.this.setFinishOnTouchOutside(true);

অক্ষম করুন:

YourActivity.this.setFinishOnTouchOutside(false);


0

পপআপ উইন্ডো খারিজ করতে ভিউ পপআপভিউ ব্যবহার করুন

`popupView.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View view) {
                       popupWindow.dismiss();
                   }
               }); 

You আপনি যদি এটি ব্যবহার করেন তবে আপনি পপআপ উইন্ডোর অভ্যন্তরের যে কোনও বোতামে অন ক্লিকলিস্টনার সেট করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.