2015-04-03 64 views
0

彈出窗口剛剛打開時,我該怎麼做?有一種方法isPopupShowing(),但不幸的是沒有像onPopupShow()回調。Android。檢測何時打開AutoCompleteTextView彈出窗口

+0

你想要做什麼?彈出窗口打開之前你想做些什麼嗎? – Pankaj 2015-04-03 09:44:16

+0

@Clairvoyant我想發送一條消息到我的統計服務器關於這個彈出窗口打開:)之前或之後是無關緊要的,我只是想知道popup保證打開並在服務器上計數。 – begezavr 2015-04-03 10:02:51

回答

0

嗯,不知道是否有一個更簡單的方法,這是一個有點變通辦法的,但你可以嘗試添加通過addTextChangedListenerTextWatcher並做了isPopupShowing()檢查是否彈出到了。再次,它的一些解決方法,並不會工作,如果你prorammatically顯示彈出。

+0

這個解決方案非常接近我的目的,一個問題是我只能在第二次文本更改後才能依靠'isPopupShowing()',並且在第一次出現時無法立即檢測到彈出窗口。 – begezavr 2015-04-03 14:29:11

+1

嗯,作爲替代方法,您可以嘗試覆蓋'AutocompleteTextView'的'onFilterComplete(int count)'方法,並檢查count> 0是否意味着至少有一個值顯示在彈出窗口上,所以popup應該在當時可見。這需要一些測試,以確定它是否真的有效:) – 2015-04-08 12:33:30

+0

@EvripidisDrakos你的建議是最好的方法來做到這一點。如果你有一些過濾結果,並且彈出窗口當前沒有顯示(isPopupShowing()),那麼你知道你即將展示它。使用文本更改的事件將不起作用;即使afterTextChanged()發生在顯示彈出窗口之前。 – ritmatter 2016-01-25 20:15:56

0

我的答案可能有點不同,但它有效,當你有有效的結果。

1.-延長AutoCompleteTextView自己的類:

public class ContractsAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView { 
    public ContractsAutoCompleteTextView(Context context) { 
     super(context); 
    } 

    public ContractsAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ContractsAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

} 

2:我們知道,當過濾項目(和後來才所示)onFilterComplete(int count)會得到通知。介紹在你的類:

@Override 
    public void onFilterComplete(int count) { 
     super.onFilterComplete(count); 
    } 

3 .-創建interface通知UI有多少項被過濾每次更改文本時間:

interface OnContractsAvailability { 
     void contractsRetrieved(int count); 
    } 

    private OnContractsAvailability onContractsAvailability; 
    public void setOnContractsAvailability(OnContractsAvailability onContractsAvailability) { 
     this.onContractsAvailability = onContractsAvailability; 
    } 

4.-現在通知您interface

@Override 
    public void onFilterComplete(int count) { 
     super.onFilterComplete(count); 
     if (onContractsAvailability != null) { 
      onContractsAvailability.contractsRetrieved(count); 
     } 
    } 

這是全班

/** 
* Created by rafaelruizmunoz on 07/07/2017. 
*/ 

public class ContractsAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView { 
    public ContractsAutoCompleteTextView(Context context) { 
     super(context); 
    } 

    public ContractsAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ContractsAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void onFilterComplete(int count) { 
     super.onFilterComplete(count); 
     if (onContractsAvailability != null) { 
      onContractsAvailability.contractsRetrieved(count); 
     } 
    } 

    interface OnContractsAvailability { 
     void contractsRetrieved(int count); 
    } 

    private OnContractsAvailability onContractsAvailability; 
    public void setOnContractsAvailability(OnContractsAvailability onContractsAvailability) { 
     this.onContractsAvailability = onContractsAvailability; 
    } 
} 

這是UI實現

contractsET.setOnContractsAvailability(count -> System.out.println(String.valueOf(count))); 

而這些結果

11月7日至7日:51:36.975 32174-32174 /? I/System.out:3138

07-07 11:51:37.520 32174-32174 /? I/System.out:1147

07-07 11:51:37.656 32174-32174 /? I/System.out:167

07-07 11:51:38.538 32174-32174 /? I/System.out:87

07-07 11:51:39.240 32174-32174 /? I/System.out:17

07-07 11:51:40.039 32174-32174 /? I/System.out:3

07-07 11:51:41.343 32174-32174 /? I/System.out:0