在棒棒糖中没有调用setOnEditorActionListener

时间:2015-06-02 23:14:17

标签: android android-layout listener

我想创建一个用户输入艺术家姓名的布局,当他按下虚拟键盘上的搜索时,会显示艺术家列表。

View rootView = (View) inflater.inflate(R.layout.fragment_search, container, false);
EditText searchArtist = (EditText) rootView.findViewById(R.id.searchArtist);
searchArtist.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            makeToast();
            return true;
        }
        return false;
    }
});

这是我的xml

<EditText
    android:id="@+id/searchArtist"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_artist"
    android:imeOptions="actionSearch"
    android:inputType="text">
    <requestFocus />

我在其他stackoverflow帖子中搜索了很多关于这一点,但没有一个解决方案似乎有效。

MinSDK 21,测试nexus 6,compileSdkVersion 22,buildToolsVersion&#39; 22.0.1&#39;。

另请注意,searchArtist(edittext)位于片段内。

更多上下文:侦听器代码位于onCreateView方法中。

4 个答案:

答案 0 :(得分:2)

我在Android 5.1.1上测试过类似的代码。有用。 我建议插入一条日志消息来检查是否正在调用onEditorAction:

var chartLegend = "<ul style=\"list-style-type: none;\">";
for(var i = 0; i < chartDatas.datasets.length; i++)
{
    chartLegend += "<li><div style=\"background-color:" + chartDatas.datasets[i].pointColor + ";height:20px; width:20px; float:left; margin:5px;\"></div>" + chartDatas.datasets[i].label + "</li>"
}

chartLegend += "</ul>";

这样,您可以确保实际调用该方法。 EditorInfo.IME_ACTION_SEARCH是常数:3

我假设makeToast();是你创建的方法,对吗?

为了添加更多信息,我在片段中测试了您的代码。所以,我真的不相信问题是你的代码被插入的地方。您只需要确保在需要使用它之前设置了侦听器。 希望这可以帮到你

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
     Log.v("TAG", "onEditorAction(): " + actionId);  
     if (actionId == EditorInfo.IME_ACTION_SEARCH) {
         Log.v("TAG", "onEditorAction(): entered");
     ...

我的xml:

public class MainFragment extends Fragment {
....
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        // view is a reference to whole fragment layout (where searchArtist is inserted)
        View view = inflater.inflate(R.layout.fragment, null);

        // Find searchArtist (There's only one @id/searchArtist inside View)
        EditText searchArtist = (EditText)view.findViewById(R.id.searchArtist);

        searchArtist.setOnEditorActionListener(new  TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                Log.v("TEMP", "I'm being clicked " + actionId);
                return true;
            }
            return false;
        }
    });
    return view;
    }// End of onCreateView
} // End of Fragment

答案 1 :(得分:1)

尝试所有解决方案后,包括setOnKeyListener和textChangeListener。最终的解决方案是删除项目并从头开始。我想环境存在问题。

我非常喜欢Android Studio,但有时这些错误让我感到震惊。

答案 2 :(得分:0)

根据建议here,尝试在编辑器操作上听取关键事件。

可以找到文档here

答案 3 :(得分:0)

我有同样的问题: OnEditorActionListener和onKeyListener都没有工作。

但是TextChangeListener解决方案可以解决问题。对我来说。

片段:

protected void onCreate(Bundle savedInstanceState){
  ...
  someField = (EditText) this.findViewById(R.id.some_field);
  someField.addTextChangeListener(someListener);
  ...
}