2017-04-19 60 views
1

我有一個簡單的「命令對話框」,它是一個包含EditText和幾個按鈕的PopupWindow。我想以下行爲:我的PopupWindow不斷竊取我的EditText的焦點

彈出窗外
  • 觸摸遣散它
  • 當彈出窗口出現時,EditText上應該抓住(並保持)焦點

我的EditText上看起來是這樣的:

<EditText 
    android:id="@+id/send_cmd_text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:maxLines="1" 
    android:hint="@string/send_cmd_hint" 
    android:textColor="#FFFFFF" 
    android:minEms="100" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:textColorHint="#BBBBBB" 
    android:inputType="text" 
    android:imeOptions="actionSend" > 

    <requestFocus /> 
</EditText> 

彈出建設看起來是這樣的:

val popup = PopupWindow(view) 
    popup.isOutsideTouchable = true 
    popup.isTouchable = true 
    popup.isFocusable = true 
    popup.contentView = view 

    // This bizarre hack allows outside touching to dismiss it. 
    popup.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 

    sendButton.setOnClickListener { 
     sendCommand() 
     popup.dismiss() 
    } 

    if (A.isHardwareKeyboardAvailable()) { 
     // This only fires for the hardware keyboard. 
     editText.setOnKeyListener { _, code, event -> handleKey(code, event) } 
    } else { 
     setImeListener() 
    } 

    editText.requestFocus() 

似乎有一個競爭條件發生。我有附加硬件鍵盤,有兩種方法可以打開彈出:

  1. 我打回車鍵後,該活動通知,然後調用構造和顯示彈出的功能。
  2. 我可以在我的用戶界面中按下一個按鈕,調用相同的功能。

每當我按下按鈕打開彈出窗口,EditText就會獲得焦點,每個人都很開心。

每當我按下我的硬件鍵盤上的Enter鍵打開彈出窗口時,EditText會短暫地獲得焦點,然後變得不專心。我懷疑沒有證據證明PopupWindow正在偷竊焦點。

我需要彈出窗口是可以聚焦的 - 否則按鍵只是轉到活動,在那裏很難將它們路由回EditText。

我還需要彈出窗口才能觸摸到外面,所以當你在外面觸摸時它會消失。

我試過設置isTouchable爲false,但它似乎沒有任何效果。

我已經嘗試了各種古怪的建議,我發現這個問題,如調用popup.update()等相關。沒有什麼解決了這個問題。

同樣,這個只有發生在按下Enter鍵打開彈出窗口時。唯一的區別是我可以看到,Activity可能會在創建彈出窗口之前暫時獲得焦點,而如果我按下UI按鈕打開彈出窗口,則Activity將永遠不會獲得鍵盤焦點。不知道,但。

爲我工作的唯一事情是設置一個計時器:

android.os.Handler().postDelayed({ editText.requestFocus() }, 250) 

這是卓有成效的,但顯然是瘸腿的,脆弱的。

任何想法如何防止我的彈出窗口從其中的EditText偷取焦點?

回答

0

查找解決

final PopupWindow popUp = new PopupWindow(vbl.getMainLayout()); 
.... 
popUp.setFocusable(true); 
popUp.update(); 
+0

我不知道爲什麼你認爲這能解決我的問題。我的問題具體說我試過popup.update(),它不起作用。它已經成爲焦點。 – user3562927