java.lang.IllegalArgumentException: Xem không được đính kèm với trình quản lý cửa sổ


148

Tôi có một hoạt động khởi động AsyncTask và hiển thị hộp thoại tiến trình trong thời gian hoạt động. Hoạt động được khai báo KHÔNG được tạo lại bằng cách xoay hoặc trượt bàn phím.

    <activity android:name=".MyActivity" 
              android:label="@string/app_name"
              android:configChanges="keyboardHidden|orientation"
              >
        <intent-filter>
        </intent-filter>
    </activity>

Khi tác vụ hoàn thành, tôi từ chối hộp thoại, nhưng trên một số điện thoại (khung: 1.5, 1.6) lỗi đó được đưa ra:

java.lang.IllegalArgumentException: View not attached to window manager
    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
    at android.view.Window$LocalWindowManager.removeView(Window.java:400)
    at android.app.Dialog.dismissDialog(Dialog.java:268)
    at android.app.Dialog.access$000(Dialog.java:69)
    at android.app.Dialog$1.run(Dialog.java:103)
    at android.app.Dialog.dismiss(Dialog.java:252)
    at xxx.onPostExecute(xxx$1.java:xxx)

Mã của tôi là:

final Dialog dialog = new AlertDialog.Builder(context)
    .setTitle("Processing...")
    .setCancelable(true)
    .create();

final AsyncTask<MyParams, Object, MyResult> task = new AsyncTask<MyParams, Object, MyResult>() {

    @Override
    protected MyResult doInBackground(MyParams... params) {
        // Long operation goes here
    }

    @Override
    protected void onPostExecute(MyResult result) {
        dialog.dismiss();
        onCompletion(result);
    }
};

task.execute(...);

dialog.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface arg0) {
        task.cancel(false);
    }
});

dialog.show();

Từ những gì tôi đã đọc ( http://bend-ing.blogspot.com/2008/11/properly-handle-proTHER-dialog-in.html ) và thấy trong các nguồn Android, có vẻ như tình huống duy nhất có thể có được đó ngoại lệ là khi hoạt động bị phá hủy. Nhưng như tôi đã đề cập, tôi cấm hoạt động giải trí cho các sự kiện cơ bản.

Vì vậy, bất kỳ đề xuất đều rất đánh giá cao.


1
Câu hỏi này đã có rất nhiều câu trả lời, nếu bất kỳ câu hỏi nào trong số chúng giúp bạn vui lòng chọn nó làm câu trả lời đúng.
Parag Kadam

Câu trả lời:


227

Đôi khi tôi cũng gặp lỗi này khi tôi khi tôi bỏ qua hộp thoại và kết thúc hoạt động từ phương thức onPostExecute. Tôi đoán đôi khi hoạt động được kết thúc trước khi hộp thoại loại bỏ thành công.

Giải pháp đơn giản nhưng hiệu quả phù hợp với tôi

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}

44
Giải pháp đơn giản? Đúng. Có hiệu lực? Có lẽ trong trường hợp này. Tôi muốn giới thiệu nó? KHÔNG! Đừng nuốt TẤT CẢ ngoại lệ như thế! Tôi thậm chí sẽ không bắt IllegalArgumentException, nhưng tìm kiếm một giải pháp khác.
Simon Forsberg

6
Bởi vì thường thì những lần thử trống rỗng là một ý tưởng tồi ... Mặc dù đôi khi nó có thể là điều đúng đắn.
Thomas

3
@Damjan Theo phản hồi của bạn, bạn đề xuất loại ngoại lệ. Vâng, đây là một thực tế xấu của Google. Bạn có thể đọc về nó ở đây: Đừng bắt ngoại lệ chung .
Yaniv

17
Tôi tin rằng đây là một sửa chữa hiệu quả. Trong các trường hợp chung, chúng tôi không nên làm điều này, nhưng vì Android Framework không cung cấp bất kỳ kiểm tra dễ dàng nào cho chúng tôi, chúng tôi phải sử dụng cách khác thường. Ngoài ra, nếu cuộc gọi isShowing () của hộp thoại hoạt động như chúng ta mong đợi, chúng ta không cần loại hack này.
SXC

1
khắc phục nhanh cho đến khi tìm thấy thứ gì đó tốt hơn
Rohit Tigga

13

Đây là giải pháp "chống đạn" của tôi, đó là tổng hợp tất cả các câu trả lời hay mà tôi tìm thấy về chủ đề này (cảm ơn @Damjan và @Kachi). Ở đây, ngoại lệ chỉ bị nuốt nếu tất cả các cách phát hiện khác không thành công. Trong trường hợp của tôi, tôi cần đóng hộp thoại tự động và đây là cách duy nhất để bảo vệ ứng dụng khỏi sự cố. Tôi hy vọng nó sẽ giúp bạn! Xin vui lòng, bỏ phiếu và để lại nhận xét nếu bạn có nhận xét hoặc giải pháp tốt hơn. Cảm ơn bạn!

public void dismissWithCheck(Dialog dialog) {
        if (dialog != null) {
            if (dialog.isShowing()) {

                //get the Context object that was used to great the dialog
                Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();

                // if the Context used here was an activity AND it hasn't been finished or destroyed
                // then dismiss it
                if (context instanceof Activity) {

                    // Api >=17
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        if (!((Activity) context).isFinishing() && !((Activity) context).isDestroyed()) {
                            dismissWithTryCatch(dialog);
                        }
                    } else {

                        // Api < 17. Unfortunately cannot check for isDestroyed()
                        if (!((Activity) context).isFinishing()) {
                            dismissWithTryCatch(dialog);
                        }
                    }
                } else
                    // if the Context used wasn't an Activity, then dismiss it too
                    dismissWithTryCatch(dialog);
            }
            dialog = null;
        }
    }

    public void dismissWithTryCatch(Dialog dialog) {
        try {
            dialog.dismiss();
        } catch (final IllegalArgumentException e) {
            // Do nothing.
        } catch (final Exception e) {
            // Do nothing.
        } finally {
            dialog = null;
        }
    }

1
giải pháp rất tốt! Cài đặt dialog = nullkhông có hiệu lực. Và StatusEventDialogchỉ nên đọc Dialog.
hgoebl

1
StatusEventDialog nên được thay đổi thành hộp thoại.
Saletanth Karumanaghat

Câu trả lời này phải là câu trả lời được chấp nhận, được xử lý rất tốt
xanh

Tôi hiểu rằng bạn muốn "chính xác" và chỉ sử dụng thử / bắt trong trường hợp isDestroyed()không có sẵn, nhưng với mục đích thực tế, sẽ không giống nhau khi chỉ sử dụng thử / bắt luôn?
zundi

11

Tôi có thể có một cách giải quyết.

Có cùng một vấn đề, nơi tôi đang tải rất nhiều mục (thông qua hệ thống tệp) vào một ListViewthông qua AsyncTask. Có onPreExecute()bắn ra a ProgressDialog, và sau đó cả hai onPostExecute()onCancelled()(được gọi khi tác vụ bị hủy rõ ràng thông qua AsyncTask.cancel()) đóng nó qua .cancel().

Có cùng lỗi "java.lang.IllegalArgumentException: View không được đính kèm với trình quản lý cửa sổ" khi tôi đang giết hộp thoại trong onCancelled()phương thức của AsyncTask(Tôi đã thấy điều này được thực hiện trong ứng dụng Kệ tuyệt vời ).

Cách giải quyết là tạo ra một lĩnh vực công cộng trong AsyncTaskđó có chứa ProgressDialog:

public ProgressDialog mDialog;

Sau đó, onDestroy()khi tôi hủy AsyncTask, tôi cũng có thể tắt hộp thoại được liên kết qua:

AsyncTask.mDialog.cancel();

Gọi trình AsyncTask.cancel()kích hoạt DOES onCancelled()trong AsyncTask, nhưng vì một số lý do tại thời điểm phương thức đó được gọi, Chế độ xem đã bị hủy và do đó việc hủy hộp thoại bị lỗi.


Tôi thấy việc triển khai UserTask chỉ xuất sắc như @Paul đã đề cập. Mã nguồn có tại đây: code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/ chủ đề
Evi Song

Mặc dù trường hợp sử dụng có thể được tìm thấy trong cùng một dự án: code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/ trộm
Evi Song

9

Đây là giải pháp chính xác để giải quyết vấn đề này:

public void hideProgress() {
    if(mProgressDialog != null) {
        if(mProgressDialog.isShowing()) { //check if dialog is showing.

            //get the Context object that was used to great the dialog
            Context context = ((ContextWrapper)mProgressDialog.getContext()).getBaseContext();

            //if the Context used here was an activity AND it hasn't been finished or destroyed
            //then dismiss it
            if(context instanceof Activity) { 
                if(!((Activity)context).isFinishing() && !((Activity)context).isDestroyed()) 
                    mProgressDialog.dismiss();
            } else //if the Context used wasnt an Activity, then dismiss it too
                mProgressDialog.dismiss();
        }
        mProgressDialog = null;
    }
}

Thay vì mù quáng nắm bắt tất cả các ngoại lệ, giải pháp này giải quyết tận gốc vấn đề: cố gắng làm mờ một hộp thoại khi hoạt động được sử dụng để khởi tạo hộp thoại đã kết thúc. Hoạt động trên Nexus 4 chạy KitKat của tôi, nhưng sẽ hoạt động cho tất cả các phiên bản Android.


3
isDestroyedyêu cầu API 17+
Androiderson

Tại sao bạn cần đặt mProTHERDialog thành null? Có liên quan đến rò rỉ bộ nhớ? Bạn có thể vui lòng giải thích?
Pawan

@Pawan, đó là một chi tiết thực hiện vào cuối của tôi. Không bắt buộc, đó chỉ là cách chức năng trong lớp này hoạt động. Sau khi hộp thoại tiến trình bị ẩn, tôi đặt nó thành null. Khi người dùng muốn hiển thị hộp thoại tiến trình khác, một phiên bản mới sẽ được khởi tạo.
Kachi

Chắc chắn! (Hoạt động) bối cảnh) .isFinishing () là bắt buộc, cảm ơn! :)
Daniel Krzyczkowski

5

tôi đồng ý ý kiến ​​của 'Damjan'.
nếu bạn sử dụng nhiều hộp thoại, nên đóng tất cả hộp thoại trong onDestroy () hoặc onStop ().
sau đó bạn có thể giảm tần suất 'java.lang.IllegalArgumentException: Chế độ xem không được đính kèm với trình quản lý cửa sổ' xảy ra.

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mDialog.dismiss();
    super.onDestroy();
}



nhưng ít vượt quá ...
để làm cho nó rõ ràng hơn, bạn không thể hiển thị bất kỳ hộp thoại nào sau khi onDestroy được gọi.
Tôi không sử dụng như dưới đây. nhưng nó rõ ràng.

private boolean mIsDestroyed = false;

private void showDialog() {
    closeDialog();

    if (mIsDestroyed) {
        Log.d(TAG, "called onDestroy() already.");
        return;
    }

    mDialog = new AlertDialog(this)
        .setTitle("title")
        .setMessage("This is DialogTest")
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        })
        .create();
    mDialog.show();
}

private void closeDialog() {
    if (mDialog != null) {
        mDialog.dismiss();
    }
}

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mIsDestroyed = true;
    closeDialog();
    super.onDestroy();
}


chúc may mắn!


Tôi sẽ luôn luôn thích tránh các khối bắt trống. đáng để thử, nhưng vì lỗi này khó tạo ra - chỉ có thời gian mới biết nó có thực sự hoạt động hay không. Dẫu sao cũng xin cảm ơn.
Dror Fichman

khối bắt trống là gì? Tôi không sử dụng thử / bắt. một biến mIsDestroyed bị vượt quá hoạt động. nhưng nếu bạn viết vào mã mà hộp thoại hiển thị sau khi một số hoạt động trong luồng khác, bạn có thể cần biến này. khi luồng khác hoạt động, nếu hoạt động kết thúc, bạn có thể xem xét ngoại lệ này.
Hogun

Tôi đã có cùng một thăm dò và khi tôi thêm @Override public void onPause () {if (hộp thoại! = Null) hộp thoại.dismiss (); super.onPause (); } cho đến hiện tại tôi không có lỗi này ... vì vậy tôi nghĩ nó giống như câu trả lời của bạn và nó thực sự hữu ích
Chris Sim

@ChrisSim xin chào! onPuase () và onDestroy () không hoạt động. khi Activity là onPuase, Dialog bị đóng. và khi bạn thực thi ứng dụng, Hộp thoại sẽ không hiển thị. bạn có muốn nó không
Hogun

@Hogun Tất nhiên, ý tôi là như vậy, tôi đang đóng hộp thoại tạm dừng thay vì hủy vì tôi cần nó tạm dừng chứ không phải hủy. Thứ hai, tôi đóng nó ngay khi nó không rỗng. Cảm ơn bạn đã giải thích điều này cho người khác.
Chris Sim

4

Dùng cái này.

if(_dialog!=null && _dialog.isShowing())
_dialog.dismiss();

2
Đó gần như là giải pháp tương tự mà @Damjan đề xuất.
Yury

28
Điều này là không đủ, IllegalArgumentException vẫn xảy ra với kiểm tra này.
Murphy

Tôi đã làm giải pháp tương tự, nhưng vẫn không biết nó có hiệu quả không. Chỉ khác nhau, tôi đã lồng hai nếu để chắc chắn rằng phần thứ hai .isShowing () sẽ không được đánh giá nếu là null.
Nick

2
Điều này là không đủ.
trante

1
@Nick: Không cần lồng nhiều iftrường hợp như thế này, &&toán tử Java có đánh giá lười biếng (còn gọi là ngắn mạch), có nghĩa là toán hạng 2 không được đánh giá nếu toán hạng thứ nhất đánh giá false(có nghĩa là kết quả của những &&sẽ luôn là falsedù sao, do đó "lười biếng" đánh giá). Tương tự như vậy ||sẽ không đánh giá toán hạng thứ 2 của nó nếu cái đầu tiên đánh giá true. Lưu ý: các toán tử &|toán tử không có hành vi này và do đó luôn luôn đánh giá cả hai toán hạng.
Matthias

3

Tôi đã có cùng một vấn đề, bạn có thể giải quyết nó bằng cách:

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}

2

Tôi nghĩ rằng mã của bạn là chính xác không giống như câu trả lời khác được đề xuất. onPostExecute sẽ chạy trên luồng UI. Đó là toàn bộ quan điểm của AsyncTask - bạn không phải lo lắng về việc gọi runOnUiThread hoặc giao dịch với các trình xử lý. Hơn nữa, theo các tài liệu, notify () có thể được gọi một cách an toàn từ bất kỳ luồng nào (không chắc họ đã biến điều này thành ngoại lệ).

Có lẽ đó là một vấn đề thời gian trong đó hộp thoại.dismiss () đang được gọi sau khi hoạt động không còn được hiển thị?

Điều gì về việc kiểm tra những gì xảy ra nếu bạn nhận xét setOn HủyListener và sau đó thoát khỏi hoạt động trong khi tác vụ nền đang chạy? Sau đó, onPostExecute của bạn sẽ cố gắng loại bỏ hộp thoại đã bị loại bỏ. Nếu ứng dụng gặp sự cố, có lẽ bạn chỉ cần kiểm tra xem hộp thoại có mở không trước khi tắt nó.

Tôi đang có cùng một vấn đề chính xác vì vậy tôi sẽ thử nó trong mã.


Tôi cũng đã xem mã dimiss () và thực sự, nó có thể được gọi một cách an toàn từ bất kỳ luồng nào. BTW, tôi gặp vấn đề với việc kiểm tra, vì sự cố này xảy ra trên điện thoại của người dùng và tôi không bao giờ có thể tự sao chép :-( Vì vậy, cố gắng tìm ra bằng cách phân tích mã ... Theo thời gian. Tôi đã suy nghĩ về điều này, nhưng không thể tưởng tượng được tình huống có thể đóng Hoạt động như thế nào trước Hộp thoại. Nếu nhấn BACK, nó sẽ hủy Hộp thoại trước. Và hoạt động giải trí tự động bị cấm bởi tệp kê khai, nhưng có thể vẫn có thể được tạo lại bằng cách nào? tôi biết nếu bạn tìm thấy một số thứ!
alex2k8

2

alex,

Tôi có thể sai ở đây, nhưng tôi nghi ngờ rằng nhiều điện thoại 'trong tự nhiên' có một lỗi khiến chúng chuyển hướng trên các ứng dụng được đánh dấu là định hướng tĩnh. Điều này xảy ra khá nhiều trên điện thoại cá nhân của tôi và trên nhiều điện thoại thử nghiệm mà nhóm chúng tôi sử dụng (bao gồm droid, n1, g1, hero). Thông thường, một ứng dụng được đánh dấu là định hướng tĩnh (có thể theo chiều dọc) sẽ tự đặt ra trong một hoặc hai giây bằng cách sử dụng hướng ngang và sau đó ngay lập tức chuyển trở lại. Kết quả cuối cùng là mặc dù bạn không muốn ứng dụng của mình chuyển hướng, nhưng bạn phải chuẩn bị sẵn sàng. Tôi không biết trong những điều kiện chính xác hành vi này có thể được sao chép, tôi không biết liệu nó có dành riêng cho phiên bản Android hay không. Tất cả những gì tôi biết là tôi đã thấy nó xảy ra rất nhiều lần :(

Tôi khuyên bạn nên sử dụng giải pháp được cung cấp trong liên kết mà bạn đã đăng để đề xuất ghi đè phương thức Activity onCreateDialog và để HĐH Android quản lý vòng đời của Hộp thoại của bạn. Đối với tôi có vẻ như mặc dù bạn không muốn hoạt động của mình chuyển hướng, nhưng đó là chuyển hướng ở đâu đó. Bạn có thể cố gắng theo dõi một phương pháp sẽ luôn ngăn chặn chuyển đổi định hướng, nhưng tôi đang cố gắng nói với bạn rằng cá nhân tôi không tin rằng có một cách dễ dàng hoạt động trên tất cả các điện thoại Android hiện tại trên thị trường.


1
Bạn có thể giữ cho thiết bị của mình không chuyển đổi định hướng, nhưng có một loạt các thay đổi cấu hình khác phá hủy / tạo lại Hoạt động của bạn - một điều phổ biến là trượt bàn phím vào hoặc ra.
MaximumGoat

2

Điều làm việc cho tôi hầu hết thời gian là để xác minh xem Hoạt động chưa kết thúc hay chưa.

if (!mActivity.isFinishing()) {
    dialog.dismiss();
}

2

Hoạt động được khai báo KHÔNG được tạo lại bằng cách xoay hoặc trượt bàn phím.

Chỉ có vấn đề tương tự. Sửa lỗi cho API cấp 13 hoặc higer.
Từ tài liệu Android:

Lưu ý: Nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên (như được khai báo bởi các thuộc tính minSdkVersion và targetSdkVersion), thì bạn cũng nên khai báo cấu hình "screenSize", bởi vì nó cũng thay đổi khi thiết bị chuyển đổi giữa hướng dọc và hướng ngang.

Vì vậy, tôi đã thay đổi bảng kê khai của mình thành:

<activity
        android:name="MyActivity"
        android:configChanges="orientation|screenSize"
        android:label="MyActivityName" >
</activity>

Và bây giờ nó hoạt động tốt. Hoạt động không được tạo lại khi tôi xoay điện thoại, hộp thoại tiến trình và chế độ xem giữ nguyên. Không có lỗi cho tôi.


đây không phải là một giải pháp ví dụ tôi có và hoạt động Adview từ admob và nó sẽ tạo lại hoạt động cho các thay đổi kích thước.
batmaci

2

Trước hết hãy xử lý lỗi khi bạn cố gắng bỏ qua hộp thoại.

 if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }

Nếu điều đó không khắc phục được thì hãy loại bỏ nó trong Phương thức hoạt động của onStop ().

 @Override
    protected void onStop() {
        super.onStop();
        if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }

1

Tôi gặp vấn đề tương tự khi sử dụng nút để đồng bộ danh sách từ máy chủ: 1) Tôi nhấp vào nút 2) Hộp thoại tiến trình hiển thị trong khi tải xuống danh sách từ máy chủ 3) Tôi chuyển thiết bị sang hướng khác 4) java.lang .IllegalArgumentException: Chế độ xem không được đính kèm với trình quản lý cửa sổ trên postExecute () của AsyncTask trong tiến trình.dismiss ().

Khi tôi thử sửa lỗi, tôi nhận ra rằng ngay cả khi sự cố không xảy ra, danh sách của tôi không hiển thị tất cả các mục.

Tôi đoán rằng những gì tôi muốn là cho AsyncTask kết thúc (và loại bỏ hộp thoại) trước khi hủy bỏ hoạt động, vì vậy tôi đã biến đối tượng asynctask thành một thuộc tính và ghi đè phương thức onDestroy ().

Nếu asynctask mất nhiều thời gian, người dùng có thể sẽ cảm thấy thiết bị chậm, nhưng tôi nghĩ đó là cái giá anh ta phải trả cho việc cố gắng thay đổi hướng thiết bị trong khi hộp thoại tiến trình đang hiển thị. Và ngay cả khi phải mất một thời gian, ứng dụng không gặp sự cố.

private AsyncTask<Boolean, Void, Boolean> atask;

@Override
protected void onDestroy() {
    if (atask!=null)
        try {
            atask.get();
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
        }
    super.onDestroy();
}

1
@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (progressDialog != null && progressDialog.isShowing()) {
                Log.i(TAG, "onPostexucte");
                progressDialog.dismiss();
}
}

3
Mặc dù đoạn mã này có thể trả lời câu hỏi cung cấp một số giải thích về cách giải quyết vấn đề sẽ giúp khách truy cập tương lai vào trang web hiểu câu trả lời của bạn
RobV

0

Mã dưới đây làm việc cho bạn, Nó hoạt động với tôi hoàn toàn tốt:

private void viewDialog() {
    try {
        Intent vpnIntent = new Intent(context, UtilityVpnService.class);
        context.startService(vpnIntent);
        final View Dialogview = View.inflate(getBaseContext(), R.layout.alert_open_internet, null);
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
        windowManager.addView(Dialogview, params);

        Button btn_cancel = (Button) Dialogview.findViewById(R.id.btn_canceldialog_internetblocked);
        Button btn_okay = (Button) Dialogview.findViewById(R.id.btn_openmainactivity);
        RelativeLayout relativeLayout = (RelativeLayout) Dialogview.findViewById(R.id.rellayout_dialog);

            btn_cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                if (Dialogview != null) {
//                                ( (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                    windowManager.removeView(Dialogview);
                                }
                            } catch (final IllegalArgumentException e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } catch (final Exception e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } finally {
                                try {
                                    if (windowManager != null && Dialogview != null) {
//                                    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                        windowManager.removeView(Dialogview);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                            //    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
//                        windowManager.removeView(Dialogview);


                        }
                    });
                }
            });
            btn_okay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //        ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                            try {
                                if (windowManager != null && Dialogview != null)
                                    windowManager.removeView(Dialogview);
                                Intent intent = new Intent(getBaseContext(), SplashActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


                                context.startActivity(intent);
                            } catch (Exception e) {
                                windowManager.removeView(Dialogview);
                                e.printStackTrace();
                            }
                        }
                    });
                }
            });
        } catch (Exception e) {
            //` windowManager.removeView(Dialogview);
            e.printStackTrace();
        }
    }

Không xác định chế độ xem của bạn trên toàn cầu nếu bạn gọi nó từ dịch vụ nền.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.