2011-01-28 33 views
17

Tôi đang phát triển cửa sổ PopUp cho Android và đang hoạt động, tôi đã thêm EditText và Nút trên đó khi chạy trên ADV hoạt động đúng cách, trong khi chạy trên thiết bị , khi tôi tập trung vào EditText, điều này tạo ra một Ngoại lệ kỳ lạ.Ngoại lệ khi tập trung EditText trong PopupWindow đang chạy trên thiết bị

android.view.WindowManager$BadTokenException: Unable to add window - - token android.view.ViewRoot&48163b18 is not valid; is your active running? 

Tôi không biết điều đó có quan trọng không, nhưng tôi đang chạy trên Galaxy Tab với đầu vào Swype.

Bây giờ tôi đọc các thông số kỹ thuật của Window.showAtLocation

public void showAtLocation (View parent, int gravity, int x, int y) 

Display the content view in a popup window at the specified location. If the popup window cannot fit on screen, it will be clipped. [...] 

Parameters 
parent a parent view to get the getWindowToken() token from 
[...] 

Vấn đề là chỉ trong token, nhưng làm thế nào để tôi vượt qua token Hoạt động với nó?

Tôi cũng đã viết một mã nhỏ để tạo lại lỗi.

PopupWindow window = new PopupWindow(activity); 
window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

window.setTouchable(true); 
window.setFocusable(true); 

EditText text = new EditText(activity); 
text.setText("Dont touch, this crash!"); 

window.setContentView(text); 
window.showAtLocation(arg0, Gravity.NO_GRAVITY, 10,10); 

Chạy trên AVD tất cả hoạt động tốt, trong khi thiết bị gặp sự cố này và ném lỗi tôi đã đề cập.

Tôi khám phá điều gì đó mới mẻ, khi tôi ở chế độ ngang, lỗi này không xảy ra.

+0

Đây có thể là ảnh toàn cảnh trong bóng tối, nhưng sau khi nghiên cứu một chút, có vẻ như vấn đề này bạn đang gặp phải có thể do bạn sử dụng Activity.getApplicationContext làm ngữ cảnh. Chủ đề này cung cấp cho bạn một giải pháp, nếu điều này thực sự là vấn đề của bạn. http://groups.google.com/group/android-developers/browse_thread/thread/7a648edddccf6f7d?pli=1 –

+1

Tôi đã thử thậm chí với rất nhiều ngữ cảnh (từ Nút, từ Hoạt động, ứng dụng) cùng một lỗi trên tất cả. –

+0

@Marcos Vasconcelos, tôi có cùng một vấn đề với bạn, và nó có vẻ không phải là mã, nhưng thiết bị gây ra sự cố. và tôi đã thử nghiệm một số tab và điện thoại android của samsumg, hầu hết trong số đó sẽ bị lỗi. Tôi muốn biết thời tiết bạn đã giải quyết vấn đề này. hoặc chúng ta nên làm gì. – DiveInto

Trả lời

3

Tôi cố gắng để chạy mã của bạn, nhưng tất cả mọi thứ hoạt động tốt đối với tôi ... Đây là lớp thử nghiệm tôi đã viết:

public class TestActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button btn = (Button) findViewById(R.id.testBtn); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       showPopup(); 
      } 
     }); 
    } 


    private void showPopup() 
    { 
     PopupWindow window = new PopupWindow(this); 
     window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
     window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

     window.setTouchable(true); 
     window.setFocusable(true); 

     EditText text = new EditText(this); 
     text.setText("Touch it, it doesn't crash"); 

     window.setContentView(text); 
     window.showAtLocation(text, Gravity.NO_GRAVITY, 30, 30); 
    } 
} 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <Button 
     android:id="@+id/testBtn" 
     android:text="Popup" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

Có lẽ bạn đã cố gắng để chạy mã popup trong hàm onCreate()? Nếu tôi làm điều đó, nó ném cùng ngoại lệ với bạn, nhưng nó bình thường vì khi onCreate() được gọi là hoạt động chưa được khởi tạo đầy đủ.

(Tôi đã thử trên Galaxy Tab quá, nhưng không có đầu vào Swype)

+0

Thực ra, tôi gọi nó từ một sự kiện, mã của bạn ném cùng một Ngoại lệ, nhưng CHỈ trên thiết bị, đây là phần kỳ lạ. Ty –

+0

Thật lạ lùng, tôi không hiểu ... đối với tôi nó cũng hoạt động tốt trên AVD như trên Tab Galaxy của tôi. – Dalmas

+0

Cũng hoạt động tốt trên Galaxy S của tôi và HTC mong muốn – Dalmas

0

Edited

thử như thế này tạo ra một lớp mới nói Popupcls

public class PopUpFlag { 
     private PopupWindow pw; 

    public void initiatePopupWindow(Activity ctx) { 
    LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout = inflater.inflate(R.layout.popupprofile, (ViewGroup) ctx.findViewById(R.id.popup_element)); 
    EditText ettext = (EditText) layout.findViewById(R.id.edit); 
    pw = new PopupWindow(layout, 300, 400, true); 
    pw.showAtLocation(layout, Gravity.BOTTOM, 0, 0); 
    } 

Bây giờ trong hoạt động của bạn nếu bạn cần cửa sổ bật lên khi nút bật lên nhấp vào viết như thế này

popupbtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       PopUpFlag puf=new PopUpFlag(); 
       puf.initiatePopupWindow(YourActivityName.this); 
      } 
     }); 

Tôi hy vọng điều này sẽ giúp s

+0

Thực ra, dòng này nằm ngoài lớp Hoạt động của tôi, nhưng hoạt động là một tham chiếu đến nó. Và tôi đã thử với rất nhiều bối cảnh –

2
EditText text = new EditText(activity); 
text.setText("Dont touch, this crash!"); 

này thực sự là nguyên nhân gây ra ngoại lệ ..

khi chúng ta ràng buộc EditText để một số văn bản nó rơi ra trên nhấp chuột khi bàn phím ảo xuất hiện ..

Nhưng cùng mã hoạt động tốt khi chúng ta không ràng buộc EditText

EditText text = new EditText(activity); 

Mặc dù tôi đang phải đối mặt với lỗi tương tự, và không có khả năng để sắp xếp ra cho đến bây giờ ....

Chỉ cần nỗ lực ở đây để tập trung vào dòng người tạo sự cố ...

bất kỳ cơ thể có thể đề nghị tại sao itz hành xử như vậy và làm thế nào để khắc phục vấn đề này ..

Thankx

0

Tôi cũng có lỗi tương tự khi EditText trong popupwindow tôi đã có một số văn bản đã hiện diện và văn bản wasn 't một từ điển (ví dụ như một tên thành phố). Khi tôi nhấp vào giữa văn bản và sự bùng nổ! Tôi có ngoại lệ. Tôi đã giải quyết bằng cách làm cho văn bản không hiển thị đề xuất chính xác tự động:

android:inputType="textNoSuggestions" 
6

Cảm ơn bạn, TheRedPill! Tôi đã có cùng một vấn đề với EditText bên trong PopupWindow hành xử stragely. Nó hoạt động trên Samsung Galaxy S3, HTC One X nhưng bị rơi trên Huawei MediaPad FHD 10. Ngay khi tôi bắt đầu chỉnh sửa ứng dụng bị lỗi.

giải pháp của bạn:

editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 

Giải Quyết vấn đề đối với tôi.

Các stack-trace là:

08-15 15:49:03.690: ERROR/AndroidRuntime(8692): FATAL EXCEPTION: main 
    android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:585) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
    at android.view.Window$LocalWindowManager.addView(Window.java:547) 
    at android.widget.PopupWindow.invokePopup(PopupWindow.java:988) 
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845) 
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809) 
    at android.widget.Editor$PinnedPopupWindow.updatePosition(Editor.java:2147) 
    at android.widget.Editor$PinnedPopupWindow.show(Editor.java:2104) 
    at android.widget.Editor$SuggestionsPopupWindow.show(Editor.java:2349) 
    at android.widget.Editor.showSuggestions(Editor.java:1647) 
    at android.widget.Editor$1.run(Editor.java:1546) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

người đàn ông của bạn +1 – Sameer

+0

Cảm ơn bạn đã lưu mã của tôi: D – sdelvalle57

+0

giải quyết vấn đề của tôi – HendraWD

4

Nguyên nhân:

tôi theo dõi các nguyên nhân của lỗi xuống chính tả hành vi tự động sửa trên một số điện thoại (Moto Droid Razr và vài điện thoại Moto khác) và một số rom Android (giống như một số ROM CM7 và CM7.1). Nếu văn bản chứa một từ không đúng chính tả và con trỏ văn bản đang lơ lửng trong hoặc gần văn bản, hệ điều hành Android sẽ thử tự động hiển thị bàn phím và cố gắng cung cấp đề xuất về chính tả chính xác.

Trên hầu hết các thiết bị, hộp đề xuất tự động sửa chỉ xuất hiện dưới dạng một đoạn đường phía trên bàn phím. Tuy nhiên trên một số ROM tùy chỉnh (CM7 là một trong những tôi dường như rất nhiều xảy ra với) và một số thiết bị (Droid Razr), có một hộp chọn thả xuống bổ sung xuất hiện:

Xem này image của popup tự động sửa Tôi rất nghi ngờ rằng danh sách thả xuống tự động chính xác cũng được thực hiện như một cửa sổ bật lên, và nó đang cố gắng sử dụng cửa sổ bật lên hiện tại (cửa sổ có chứa EditText với các cửa sổ bật lên hiện tại). từ sai chính tả) làm chế độ xem gốc và cố gắng lấy windowToken từ chế độ xem gốc.

Vì cửa sổ bật lên không phải là chế độ xem truyền thống, tôi cho rằng không thể cung cấp đúng windowToken cho các chế độ xem khác, những người đang yêu cầu chúng, do đó dẫn đến lỗi.

Các Giải pháp:

1) Cách đơn giản nhất tôi có thể nhận được xung quanh vấn đề này là sử dụng Dialog thay vì cửa sổ Popup. API của họ thực sự tương tự và trong trường hợp của tôi khá dễ dàng để thay thế PopupWindow bằng Dialog.

Ví dụ:

Cũ mã:

LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater(); 
    View mainView = parentActivity.findViewById(R.id.main_calendar_fragment); 
    updateEventPopupWindow = new PopupWindow(inflater.inflate(
      R.layout.add_event_fragment, null, false), metrics.widthPixels, metrics.heightPixels, true); 
    updateEventPopupWindow.setBackgroundDrawable(new BitmapDrawable()); 
    updateEventPopupWindow.showAtLocation(mainView, Gravity.CENTER, 0, 0); 

Code mới:

LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater(); 
    View mainView = parentActivity.findViewById(R.id.main_calendar_fragment);  
    updateEventDialog = new Dialog(parentActivity, android.R.style.Theme_NoTitleBar); 
    updateEventDialog.setContentView(inflater.inflate(R.layout.add_event_fragment, (ViewGroup) mainView, false)); 
    updateEventDialog.show(); 

2) Cách tiếp cận thứ hai là khó khăn hơn, nhưng có thể là một phù hợp nếu PopupWindow để thay thế Dialog là không thể thực hiện được, là người dùng Fragments thay cho PopupWindows. Có rất nhiều đoạn tốt tutorials ngoài kia, vì vậy tôi sẽ không bận tâm xem xét cách thực hiện điều này trong bài đăng này.

3) Như một phương sách cuối cùng, giống như nhiều áp phích được đề cập ở trên, bạn có thể tắt tự động sửa văn bản trên các trường EditText bên trong PopupWindwow sang bước bên này. Tuy nhiên điều này dẫn đến trải nghiệm người dùng khủng khiếp, vì nhiều người dùng (và bàn phím như swype) dựa vào tự động sửa, làm điều này có khả năng sẽ khiến người dùng rời khỏi ứng dụng của bạn.

Hy vọng điều này sẽ giúp những người khác đang đối mặt với vấn đề này. Tôi đập đầu vào bàn phím hơn một ngày trước khi cuối cùng quyết định thử phương pháp Dialog, điều khiến tôi ngạc nhiên là khá dễ trao đổi. Chúc may mắn cho bạn

0

Sự cố xảy ra trên EditText được đặt trong Trình quản lý cửa sổ khi người dùng nhấn vào một từ được gạch chân là màu đỏ. Một từ gạch chân như vậy có nghĩa là nó không tồn tại trong từ điển. Trên vòi, hệ điều hành sẽ cố gắng hiển thị cửa sổ bật lên có các từ phù hợp nhất từ ​​từ điển và sự cố do cửa sổ bật lên không thể được đính kèm vào cửa sổ do ngoại lệ mã thông báo lỗi.

Chỉ có giải pháp sau đây dường như làm việc cho tôi trình

//assume an EditText object with name myEditText 
myEditText.setInputType(myEditText.getInputType() | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 

InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS dường như không làm việc như mong đợi trên tất cả các bàn phím trong khi InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD có nhược điểm mà nó cũng vô hiệu hóa chuyển đổi qua lại các ngôn ngữ trong bàn phím và cử chỉ vuốt để thêm văn bản.

Các vấn đề liên quan