অ্যান্ড্রয়েড 1.6: "android.view.WindowManager $ BadTokenException: উইন্ডো যুক্ত করতে অক্ষম - টোকেন নাল অ্যাপ্লিকেশনটির জন্য নয়"


303

আমি একটি ডায়লগ উইন্ডো খোলার চেষ্টা করছি, তবে যতবারই এটি খোলার চেষ্টা করব তখনই এই ব্যতিক্রমটি ছুঁড়ে ফেলা হবে:

Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException: 
     Unable to add window -- token null is not for an application
  at android.view.ViewRoot.setView(ViewRoot.java:460)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
  at android.app.Dialog.show(Dialog.java:238)
  at android.app.Activity.showDialog(Activity.java:2413)

আমি showDialogপ্রদর্শন আইডি কল করে এটি তৈরি করছি । onCreateDialogহ্যান্ডলার জরিমানা লগ এবং আমি এটা মাধ্যমে একটি বিষয় ছাড়া পইঠা পারেন, কিন্তু আমি এটা সংযুক্ত করেছি যেহেতু এটি দেখে মনে হচ্ছে আমি কিছু অনুপস্থিত করছি:

@Override
public Dialog onCreateDialog(int id)
{
    Dialog dialog;
    Context appContext = this.getApplicationContext();
    switch(id)
    {
        case RENAME_DIALOG_ID:
            Log.i("Edit", "Creating rename dialog...");
            dialog = new Dialog(appContext);
            dialog.setContentView(R.layout.rename);
            dialog.setTitle("Rename " + noteName);
            break;
        default:
            dialog = null;
            break;
    }
    return dialog;      
}

এ থেকে কিছু অনুপস্থিত আছে? কিছু প্রশ্ন থেকে ডায়লগ তৈরি করার সময় এই সমস্যাটি হওয়ার কথা বলেছে onCreateযা ঘটেছিল কারণ কার্যকলাপটি এখনও তৈরি হয়নি, তবে এটি একটি মেনু অবজেক্টের কল থেকে এসেছে এবং appContextভেরিয়েবলটি মনে হচ্ছে এটি সঠিকভাবে ডিবাগারে স্থান পেয়েছে।

উত্তর:


609

পরিবর্তে: Context appContext = this.getApplicationContext(); আপনার (সম্ভবত this) যে কার্যকলাপে রয়েছেন তার জন্য আপনাকে পয়েন্টার ব্যবহার করা উচিত ।

আমি আজও এটি কামড়েছি, বিরক্তিকর অংশটি হ'ল getApplicationContext()ডেভেলপার.অ্যান্ড্রয়েড ডট কম থেকে ভার্চটিম :(


2
এটি একটি বাগ হিসাবেও রিপোর্ট করা হয়েছে (যদিও এটি ব্যবহারকারী প্রশ্ন পোস্ট করার সময় ছিল না): Code.google.com/p/android/issues/detail?id=11199
রেমন্ড মার্টিনো

63
কেবল যদি এটি কাউকে সহায়তা করে - একটি কথোপকথনে আপনার প্রসঙ্গ হিসাবে myActivity.th ব্যবহার করুন।
রাব রস

13
এই প্রশ্নোত্তর 2 দিনের মধ্যে 3 বছরের পুরানো হয়ে যায়। আমি এখনও খ্যাতি পাচ্ছি, তাই আমি অনুমান করি গুগল এখনও তাদের ডক্স স্থির করেনি ...
টর্প


6
এটি 2016 সালের এপ্রিল, এবং এখনও এই ব্যতিক্রমটি সংলাপের সূচনায় অ্যাপ্লিকেশন ক্র্যাশ করে।
যোগেশ সেরালিয়া

78

আপনি কোনও ক্রিয়াকলাপ নয় এমন একটি প্রসঙ্গের মাধ্যমে অ্যাপ্লিকেশন উইন্ডো / সংলাপ প্রদর্শন করতে পারবেন না। একটি বৈধ কার্যকলাপ রেফারেন্স পাস করার চেষ্টা করুন


কীভাবে? আমি চেষ্টা activity.thisএবং activity.getBaseContext()কিন্তু কোন উপকার। কোন সাহায্য?
দর্পণ

3
বুঝেছি. এতে সরাসরি আপনার ক্রিয়াকলাপের নামটি দিন। ছাড়া .this
দর্পণ

45

GetapplicationContext জিনিস এ।

অ্যান্ড্রয়েড সাইটের দস্তাবেজগুলি এটি ব্যবহার করতে বলে, তবে এটি কার্যকর হয় না ... grrrrr :-P

শুধু কর:

dialog = new Dialog(this); 

"এটি" হ'ল আপনার ক্রিয়াকলাপ যা থেকে আপনি ডায়ালগ শুরু করেন।


43

অ্যান্ড্রয়েড ডকুমেন্টগুলি getApplicationContext () ব্যবহার করার পরামর্শ দেয়;

সতর্কতা ডায়ালগ.বিল্ডার বা সতর্কতা ডায়ালগ বা ডায়ালগ ইনস্ট্যান্ট করার সময় এটি আপনার বর্তমান ক্রিয়াকলাপটির পরিবর্তে কাজ করবে না ...

উদা:

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

অথবা

AlertDialog.Builder builder = new  AlertDialog.Builder((Your Activity).this);

এটি আমাকে ব্যাপকভাবে সাহায্য করেছিল। আমি অন্য একটি কথোপকথনের মধ্যে থেকে একটি সংলাপ তৈরি করার চেষ্টা করছিলাম এবং কেবল "সতর্কতা ডায়ালগ.বিল্ডার (এটি) রয়েছে;" একটি ত্রুটি দিচ্ছিল ধন্যবাদ!
EHarpham

(ActivityName.this) একটি বোতামের
অনক্লিকের

আমার সমস্যাটি হ'ল আমি একটি অ্যাডাপ্টারের অভ্যন্তরে একটি সতর্কতা ডায়ালগের ভিতরে একটি প্রগ্রেস ডায়ালগ তৈরি করছি ... আমি এটি কাজ করতে পারি না।
মার্টিন এরলিক


13

আমার একই ধরণের সমস্যা হয়েছিল যেখানে আমার অন্য শ্রেণিটির কিছু ছিল:

public class Something {
  MyActivity myActivity;

  public Something(MyActivity myActivity) {
    this.myActivity=myActivity;
  }

  public void someMethod() {
   .
   .
   AlertDialog.Builder builder = new AlertDialog.Builder(myActivity);
   .
   AlertDialog alert = builder.create();
   alert.show();
  }
}

বেশিরভাগ সময় সূক্ষ্মভাবে কাজ করে, তবে কখনও কখনও এটি একই ত্রুটির সাথে ক্র্যাশ হয়ে যায়। তখন আমি বুঝতে পারি যে MyActivityআমার মধ্যে ...

public class MyActivity extends Activity {
  public static Something something;

  public void someMethod() {
    if (something==null) {
      something=new Something(this);
    }
  }
}

যেহেতু আমি এই বস্তুটি ধরে রেখেছি তাই static, কোডের দ্বিতীয় রানটি এখনও অবজেক্টের মূল সংস্করণটি ধারণ করে, এবং এইভাবে এখনও মূলটিকে বোঝাচ্ছিল Activity, যার অস্তিত্ব নেই।

নির্বোধ মূর্খ ভুল, বিশেষত যেমন আমার staticপ্রথম স্থানটির মতো বস্তুটি ধরে রাখা দরকার ছিল না ...


12

শুধু এটিকে পরিবর্তন করুন

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

পরিবর্তে

AlertDialog.Builder alert_Categoryitem = 
    new AlertDialog.Builder(getApplicationContext());

9

আরেকটি সমাধান হ'ল উইন্ডো টাইপটিকে একটি সিস্টেম ডায়ালগে সেট করা:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

এটির জন্য SYSTEM_ALERT_WINDOWঅনুমতি প্রয়োজন :

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

যেমন ডকস বলেছেন:

খুব কম অ্যাপ্লিকেশনগুলির এই অনুমতিটি ব্যবহার করা উচিত; এই উইন্ডোগুলি ব্যবহারকারীর সাথে সিস্টেম-স্তরের কথোপকথনের জন্য তৈরি।

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


এটি এখন এপিআই স্তর ২ 26 থেকে প্রত্যাখ্যানিত পতাকা। কারণ এটি বিকাশকারীকে সিস্টেম উইন্ডো দিয়ে খেলতে দেয় যা ব্যবহারকারীর দৃষ্টিকোণ থেকে ভাল নয়।
কক্সঅনরোড

4

getApplicationContext()ডায়ালগ ঘোষণা করার জন্য ব্যবহার করবেন না

সর্বদা ব্যবহার করুন thisবা আপনারactivity.this


2

নেস্টেড কথোপকথনের জন্য এই সমস্যাটি খুব সাধারণ, এটি যখন কাজ করে তখন

AlertDialog.Builder mDialogBuilder = new AlertDialog.Builder(MyActivity.this);

পরিবর্তে ব্যবহৃত হয়

mDialogBuilder = new AlertDialog.Builder(getApplicationContext);

এই বিকল্প।


2

এটি আমার জন্য কাজ করেছে--

new AlertDialog.Builder(MainActivity.this)
        .setMessage(Html.fromHtml("<b><i><u>Spread Knowledge Unto The Last</u></i></b>"))
        .setCancelable(false)
        .setPositiveButton("Dismiss",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                    }
                }).show();

ব্যবহার

ActivityName.this

0

আপনি এটি করতে পারেন

public class Example extends Activity {
    final Context context = this;
    final Dialog dialog = new Dialog(context);
}

এটি আমার জন্য কাজ করেছে !!


0

যেমনটি বলা হয়েছে, আপনার ডায়ালগটির প্রসঙ্গ হিসাবে একটি ক্রিয়াকলাপ প্রয়োজন, একটি স্থির প্রসঙ্গে "আপনার কার্যকলাপ। এটি" ব্যবহার করুন বা নিরাপদ মোডে ডায়নামিকটি কীভাবে ব্যবহার করতে হয় তা এখানে পরীক্ষা করে দেখুন


0

dialogউইন্ডো টাইপ এ পুনরায় সেট করার চেষ্টা করুন

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

অনুমতি ব্যবহার করতে ভুলবেন না android.permission.SYSTEM_ALERT_WINDOW


0
public class Splash extends Activity {

    Location location;
    LocationManager locationManager;
    LocationListener locationlistener;
    ImageView image_view;
    ublic static ProgressDialog progressdialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        progressdialog = new ProgressDialog(Splash.this);
           image_view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                        locationManager.requestLocationUpdates("gps", 100000, 1, locationlistener);
                        Toast.makeText(getApplicationContext(), "Getting Location plz wait...", Toast.LENGTH_SHORT).show();

                            progressdialog.setMessage("getting Location");
                            progressdialog.show();
                            Intent intent = new Intent(Splash.this,Show_LatLng.class);
//                          }
        });
    }

এখানে পাঠ্য: - প্রসঙ্গ
পাওয়ার activityজন্য এটি ব্যবহার করুনprogressdialog

 progressdialog = new ProgressDialog(Splash.this);

অথবা progressdialog = new ProgressDialog(this);

জন্য BroadcastListener নয় অ্যাপ্লিকেশন প্রসঙ্গ পেতে এটি ব্যবহার করুন progressdialog

progressdialog = new ProgressDialog(getApplicationContext());
progressdialog = new ProgressDialog(getBaseContext());

0

অ্যাসিঙ্কটাস্কে একটি 'প্রগ্রেসডায়ালগ' প্রদর্শন করার সর্বোত্তম এবং নিরাপদতম উপায়, মেমরি ফাঁসের সমস্যা এড়ানো লোপার.মাইন () সহ একটি 'হ্যান্ডলার' ব্যবহার করা।

    private ProgressDialog tProgressDialog;

তারপরে 'অনক্রিট' এ

    tProgressDialog = new ProgressDialog(this);
    tProgressDialog.setMessage(getString(R.string.loading));
    tProgressDialog.setIndeterminate(true);

এখন আপনি সেটআপ অংশটি দিয়ে শেষ করেছেন। এখন AsyncTask এ 'showProgress ()' এবং 'hideProgress ()' কল করুন।

    private void showProgress(){
        new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                tProgressDialog.show();
            }
        }.sendEmptyMessage(1);
    }

    private void hideProgress(){
        new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                tProgressDialog.dismiss();
            }
        }.sendEmptyMessage(1);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.