2015-04-03 66 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