intent - typeface android example




"android.view.WindowManager $ BadTokenException: غير قادر على إضافة إطار" على buider.show() (5)

أقوم بإنشاء حوار في onCreate واستخدامه مع show hide . بالنسبة لي ، لم يكن السبب الأساسي هو رفض onBackPressed ، الذي كان ينهي نشاط Home .

@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                Home.this.finish();
                                return;
                            }
                        }).create().show();

لقد تم الانتهاء من Home Activity onBackPressed بدون إغلاق / onBackPressed مربعات الحوار الخاصة بي.

عندما رفضت حواراتي اختفى الانهيار.

new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                networkErrorDialog.dismiss() ;
                                homeLocationErrorDialog.dismiss() ;
                                currentLocationErrorDialog.dismiss() ;
                                Home.this.finish();
                                return;
                            }
                        }).create().show();

من نشاطي الأساسي ، أحتاج إلى الاتصال بفصل داخلي وفي طريقة داخل الصف ، أحتاج إلى إظهار AlertDialg واستبعاده عند الضغط على زر OK وإرساله إلى Google Play للشراء.

الأشياء تعمل بشكل مثالي لمعظم الأوقات ، ولكن بالنسبة لعدد قليل من المستخدمين هو تحطمها على builder.show() وأستطيع أن أرى "android.view.WindowManager$BadTokenException: غير قادر على إضافة نافذة" من سجل التعطل. الرجاء الاقتراح.

رمز بلدي يشبه إلى حد كبير هذا:

public class classname1 extends Activity{

  public void onCreate(Bundle savedInstanceState) {
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.<view>); 

    //call the <className1> class to execute
  }

  private class classNamename2 extends AsyncTask<String, Void, String>{

    protected String doInBackground(String... params) {}

    protected void onPostExecute(String result){
      if(page.contains("error")) 
      {
        AlertDialog.Builder builder = new AlertDialog.Builder(classname1.this);
        builder.setCancelable(true);
        builder.setMessage("");
        builder.setInverseBackgroundForced(true);
        builder.setNeutralButton("Ok",new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int whichButton){
            dialog.dismiss();
            if(!<condition>)
            {
              try
              {
                String pl = ""; 

                mHelper.<flow>(<class>.this, SKU, RC_REQUEST, 
                  <listener>, pl);
              }

              catch(Exception e)
              {
                e.printStackTrace();
              }
            }  
          }
        });

        builder.show();
      }
    }
  }
}

لقد رأيت أيضًا الخطأ في تنبيه آخر حيث لا أعيد توجيه أي نشاط آخر. انها بسيطة مثل هذا:

AlertDialog.Builder builder = new AlertDialog.Builder(classname1.this);
    builder.setCancelable(true);

    //if successful
    builder.setMessage(" ");
    builder.setInverseBackgroundForced(true);
    builder.setNeutralButton("Ok",new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton){
            // dialog.dismiss();
                   }
    });
    builder.show();
}

السبب المحتمل هو سياق مربع حوار التنبيه. قد تنتهي من هذا النشاط بحيث يحاول فتحه في هذا السياق ولكنه مغلق بالفعل. حاول تغيير سياق هذا الحوار إلى نشاطك الأول لأنه لا ينتهي حتى النهاية.

على سبيل المثال

بدلا من ذلك.

AlertDialog alertDialog = new AlertDialog.Builder(this).create();

حاول استخدام

AlertDialog alertDialog = new AlertDialog.Builder(FirstActivity.getInstance()).create();

كان لدي حوار يظهر الوظيفة:

void showDialog(){
    new AlertDialog.Builder(MyActivity.this)
    ...
    .show();
}

كنت أتلقى هذا الخطأ وكان عليّ فقط التحقق من isFinishing() قبل أن نطلق على هذا الحوار إظهار الوظيفة.

if(!isFinishing())
    showDialog();

مع هذه الفكرة المتغيرات globals ، أنقذت MainActivity على سبيل المثال في onCreate () ؛ المتغير العالمي Android

public class ApplicationController extends Application {

    public static MainActivity this_MainActivity;
}

وفتح الحوار مثل هذا. انها عملت.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Global Var
    globals = (ApplicationController) this.getApplication();
    globals.this_MainActivity = this;
}

وفي سلسلة محادثات ، أفتح حوارًا مثل هذا.

AlertDialog.Builder alert = new AlertDialog.Builder(globals.this_MainActivity);
  1. افتح MainActivity
  2. بدء موضوع.
  3. فتح الحوار من الموضوع -> العمل.
  4. انقر فوق "زر العودة" (سيتم استدعاء onCreate وإزالة MainActivity الأول)
  5. سوف تبدأ MainActivity جديدة. (وحفظ هذا المثال على globals)
  6. فتح الحوار من أول موضوع -> سوف تفتح وتعمل.

:)


  • أولاً لا يمكنك توسيع AsyncTask دون تجاوز doInBackground
  • محاولة ثانية لخلق AlterDailog من باني ثم استدعاء المعرض ().

    private boolean visible = false;
    class chkSubscription extends AsyncTask<String, Void, String>
    {
    
        protected void onPostExecute(String result)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setCancelable(true);
            builder.setMessage(sucObject);
            builder.setInverseBackgroundForced(true);
            builder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton)
                {
                    dialog.dismiss();
                }
            });
    
            AlertDialog myAlertDialog = builder.create();
            if(visible) myAlertDialog.show();
        }
    
        @Override
        protected String doInBackground(String... arg0)
        {
            // TODO Auto-generated method stub
            return null;
        }
    }
    
    
    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();
        visible = true;
    }
    
    @Override
    protected void onStop()
    {
        visible = false; 
        super.onStop();
    }
    






android-alertdialog