অ্যান্ড্রয়েড 'উইন্ডো যুক্ত করতে অক্ষম - টোকেন নাল কোনও অ্যাপ্লিকেশনটির জন্য নয়' ব্যতিক্রম


134

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

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
কিছু কোড পোস্ট না করে আমাদের কীভাবে জানার কথা?
ফালমারি


1
দয়া করে এই উত্তরটি উল্লেখ করুন, এই উত্তরের লিঙ্কটি পোস্ট করার প্রধান বিষয় হ'ল এই উত্তরের উপর মন্তব্যে দুর্দান্ত কথোপকথন রয়েছে যা বর্ণনা করে যে এই সমস্যা কেন আসছে এবং এটি মোকাবিলার সর্বোত্তম উপায় হ'ল http://stackoverflow.com/a/ 7229248/501483
ধরম

আপনি যদি পরিষেবাটি ব্যবহার করেন তবে স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি 232316689/… পড়ুন
কুলমাইন্ড

উত্তর:


421

আমি অনুমান করছি - আপনি কি অ্যাপ্লিকেশন প্রসঙ্গে ডায়ালগ তৈরির চেষ্টা করছেন? এটার মতো কিছু:

new Dialog(getApplicationContext());

এটা ভুল. আপনার একটি কার্যকলাপ প্রসঙ্গ ব্যবহার করা দরকার context

আপনার মত চেষ্টা করতে হবে:

new Dialog(YourActivity.this);

1
ধন্যবাদ। তবে আমি নতুন ডায়ালগ (getApplicationContext ()) ব্যবহার করিনি; আমি কেবল 'নতুন সতর্কতা ডায়ালগ.বিল্ডার (এমকন্টেক্সট) ব্যবহার করি;' যেখানে এমকন্টেক্সট কোনও ক্রিয়াকলাপের প্রতি আলাদা ferent
মাইকেল 25

10
তারপরে এমকনটেক্সটটি MyActivity.th হওয়া উচিত th
লুইস

10
একটি কাস্টম ডায়ালগ তৈরির জন্য অ্যান্ড্রয়েড ডক্স ( ডেভেলপার.অ্যান্ড্রয়েড. com/guide/topics/ui/dialogs.html# কাস্টম ডায়ালগ) এ ত্রুটি রয়েছে। প্রসঙ্গ mContext = getApplicationContext (); কথোপকথন ডায়ালগ = নতুন ডায়ালগ (mContext); আপনার স্থিরতা ডায়ালগ ডায়ালগকে নিয়ে যায় = নতুন ডায়ালগ (এটি); যা কাজ করে! ধন্যবাদ
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html ঠিক করা হয়েছে (কিছুক্ষণ থেকে)। রেফারেন্সের জন্য এটি কেবল নির্দেশ করা। প্যাটার্নটি পাশাপাশি উন্নত করা হয়েছে। :)
মার্টিন মার্ককোসিনি

2
getActivity()@ সাগরদেভঙ্গা ব্যবহার করুন
প্রতীক

34

আপনি ব্যবহার চালিয়ে যেতে পারেন getApplicationContext()তবে ব্যবহারের আগে আপনার এই পতাকাটি যুক্ত করা উচিত: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)এবং ত্রুটিটি প্রদর্শিত হবে না।

এবং অনুমতি যোগ করতে ভুলবেন না:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

হ্যাঁ, এটি বেশ সহজ। এবং অনুমতি যুক্ত করতে ভুলবেন না, আমি এখনই সম্পাদনা করেছি।
কোডজজেক্স

3
একটি পুনর্ব্যবহারযোগ্য অ্যাডাপ্টারে getActivity () ব্যবহার করতে পারবেন না
মার্টিন এরলিক

যে ভয়ঙ্কর :) হল
সৈয়দ হামজা হাসান

আপনি কীভাবে পতাকা যুক্ত করবেন?
কনার দাসসেন

13

আমার ক্ষেত্রে আমি এই জাতীয় সংলাপটি তৈরি করার চেষ্টা করছিলাম:

new Dialog(getApplicationContext());

সুতরাং আমাকে এর জন্য পরিবর্তন করতে হয়েছিল:

new Dialog(this);

এবং এটি আমার পক্ষে ভাল কাজ করে;)


1
আপনার উত্তরটি সঠিক, তবে এটি কেবল তখনই কাজ করবে যখন আপনি কার্যকলাপের সুযোগে থাকবেন। আপনি যদি কোনও অভ্যন্তরীণ স্কোপে থাকেন তবে আপনাকে তার MyActivity.classপরিবর্তে ব্যবহার করতে হবে thisকারণ thisএকটি ভিন্ন অবজেক্টকে বোঝায়।
শাহর

1
এছাড়াও, আপনার থিমটি উত্তরাধিকার সূত্রে thisনিশ্চিত করবে Dialog
TheRealChx101

12

ব্যবহার করে দেখুন getParent()যুক্তি স্থানে এর contextমত new AlertDialog.Builder(getParent());হোপ এটি কাজ করবে, এটা আমার জন্য কাজ করেন।


গেটপেন্ট ()? কেন ব্যবহার করবেন?
জোসে কাস্ত্রো

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

1
ধন্যবাদ @ প্রিয়ঙ্ক জোশি, আপনি আমার দিনটি বাঁচিয়েছেন, "উইন্ডো যুক্ত করতে অ্যান্ড্রয়েড অক্ষম বৈধ নয়; আপনার ক্রিয়াকলাপটি চলছে?" "এর অদ্ভুত ব্যতিক্রমটিও সমাধান করে।
এসলাম ইউসুফ মোহাম্মদ

আমি কীভাবে গেটপ্যারেন্ট () ব্যবহার করতে পারি?
ভিনিডোগ

ধন্যবাদ! এটা আমার ক্ষেত্রে কাজ করেছে। আমি ফোন করছিলাম this.parent.getActivity().getApplicationContext()কিন্তু this.parent.getActivity()কৌশলটি করলাম ।
কার্লোডোঞ্জ

3

আমি অনুমান করছি - আপনি কি ডায়ালগ ব্যবহার করে তৈরি করার চেষ্টা করছেন?

 getApplicationContext()
 mContext which is passed by activity.

আপনি যদি ডায়লগ অ অ্যাক্টিভিটি ক্লাস প্রদর্শন করেন তবে আপনাকে প্যারামিটার হিসাবে ক্রিয়াকলাপটি পাস করতে হবে।

Activity activity=YourActivity.this;

এখন এটি দুর্দান্ত কাজ হবে।

যদি আপনার কোন সমস্যা মনে হয় তবে আমাকে জানান।


2

প্রসঙ্গ ক্ষেত্রে আমি এটি দিয়ে চেষ্টা করেছি:

this.getActivity().getParent()

এবং এটা আমার জন্য ভাল কাজ করে। এটি এমন একটি শ্রেণীর ছিল যা "ফ্রেগমেন্ট" থেকে প্রসারিত:

public class filtro extends Fragment{...

2

হ্যালো আপনি যদি অ্যাডাপ্টার ব্যবহার করে থাকেন তবে সেখানে একটি সুযোগ থাকতে পারে।
আপনি যখন অ্যাডাপ্টারে কোনও ডায়ালগ, getContext (), প্রসঙ্গ বা ক্রিয়াকলাপ কোনও সময় ব্যবহার করবেন না তখন আপনাকে জানতে হবে।

আমি যে কৌশলটি ব্যবহার করেছি তা v.getRootView().getContext() এখানে v যা আপনি উল্লেখ করছেন এমন ভিউ অবজেক্ট।
যেমন।


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

ধন্যবাদ ! আমার মূল্যবান সময় বাঁচানোর জন্য !! (^_^)
চমৎকার

1

আমিও একই ব্যতিক্রম পেয়েছি। আমি এটি ঠিক করতে যা করি তা হ'ল ডায়ালগটির উদাহরণটি ফাংশন হিসাবে প্যারামিটার হিসাবে পাস করা এবং এটি কেবল কনটেক্সট পাস করার পরিবর্তে getContext () ব্যবহার করে ব্যবহার করা। এই সমাধানটি আমার সমস্যার সমাধান করে, আশা করি এটি সহায়তা করতে পারে


0

আমি এই ব্যতিক্রমটি পেয়েছি, যখন আমি কর্ডোভা প্লাগইনের অধীনে দু'টি ক্ষেত্রে ব্যবহার করে প্রগতি ডায়ালগ খোলার চেষ্টা করেছি,

  1. নতুন প্রগ্রেসডায়ালগ (this.cordova.getActivity ()। getParent ());

  2. নতুন প্রগ্রেসডায়ালগ (this.cordova.getActivity ()। getapplicationContext ());

পরবর্তীতে এর মতো বদলে গেছে,

নতুন প্রগ্রেসডায়ালগ (this.cordova.getActivity ());

এটা আমার জন্য কাজ করে।


0

এটি ব্যবহার করুন এবং প্রসঙ্গটি আমার পক্ষে কাজ করেনি .. তবে আমার অ্যাক্টিভিটিনেম.এটি কাজ করেছে। আশা করি এটি যার প্রয়োজন তাদেরকে সহায়তা করে।


0

আমি এই ত্রুটিটি AndroidManLive.xML এ ব্যবহারকারী-অনুমতি নীচে যুক্ত করে সমাধান করেছি

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

এছাড়াও, ক্রিয়াকলাপের নাম দিয়ে সতর্কতা ডায়ালগ শুরু করুন:

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

আরও তথ্যের জন্য, দেখুন ==> অ্যান্ড্রয়েডে কীভাবে সতর্কতা ডায়ালগ তৈরি করবেন

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