【问题标题】:How to set a SearchView's input type to numeric如何将 SearchView 的输入类型设置为数字
【发布时间】:2012-03-03 05:01:21
【问题描述】:

我目前在我的应用程序的ActionBar 中有一个SearchView(我从 XML 布局文件中填充),我试图强制它只接受数字输入。我试过在 XML 中设置android:inputType="number" 属性,但是没有效果。

有人知道这个问题的根源吗?

XML 菜单资源:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/search"
        android:title="@string/menu_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/ic_menu_search_holo_light"
        android:inputType="number" />       
</menu>

【问题讨论】:

  • 看到这个link
  • 感谢您的建议,但我知道在就 StackOverflow 提问之前先查阅 Android 文档:P
  • 此外,文档似乎表明这种方法应该没有任何问题。

标签: android android-view android-actionbar


【解决方案1】:

在 API 14 中引入了 searchView 上的 setInputType。要将其设置为数字,请尝试:

searchView.setInputType(InputType.TYPE_CLASS_NUMBER);

【讨论】:

  • 这也适用于 AppCompat-v7 android.support.v7.widget.SearchView。
  • searchView.setInputType(InputType.TYPE_CLASS_NUMBER);
【解决方案2】:

对于 Kotlin 用户

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    val searchMenuItem = menu?.findItem(R.id.menu_search)
    val searchView = searchMenuItem?.actionView as SearchView
    searchView.inputType = InputType.TYPE_CLASS_NUMBER
    return true
}

【讨论】:

    【解决方案3】:

    如果是在兼容库片段中设置,则需要使用SearchViewCompat.setInputType(View searchView, int inputType)

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.searchable, menu);
        MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        if (searchMenuItem != null) {
            SearchView searchView = (SearchView) searchMenuItem.getActionView();
            if (searchView != null) {
                SearchViewCompat.setInputType(searchView, InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS);
            }
        }
    }
    

    【讨论】:

    • SearchViewCompat.setInputType() 已弃用。可以直接访问 inputType 已更改。科特林searchView.setInputType = InputType.TYPE_CLASS_NUMBER
    • 应该是searchView?.inputType = InputType.TYPE_CLASS_NUMBER
    【解决方案4】:

    当使用android.support.v7.widget 中的SearchView 时,您可以使用:

    searchView.setInputType(InputType.TYPE_CLASS_NUMBER);
    

    【讨论】:

      【解决方案5】:

      这并不完全是一个答案,但请记住,输入类型过滤器的有用性可能取决于您使用的 IME;一些键盘并不容易服从这些输入类型......我很难学到这一点。 :(

      考虑到这一点,您是否尝试过使用其他输入类型来查看它们是否会保持不变?如果他们确实坚持,这可能是一个 IME 问题。如果他们不这样做,则可能是您尝试强制输入类型的方式存在问题。

      现在,来看看答案:

      您可以尝试在 onCreateOptionsMenu 中通过该菜单项的 ID 进行查找,转换为 SearchView,并在代码中设置输入类型:

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater menuInflater = getMenuInflater();
          menuInflater.inflate(R.menu.default_menu, menu);
      
          if (MyApplication.SUPPORTS_HONEYCOMB) { // quick check for API level
              // If we have the honeycomb API, set up the search view
              MenuItem searchItem = menu.findItem(R.id.search);
      
              SearchView search = (SearchView) searchItem.getActionView();
      
              // your code here.  something like:
              search.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
      
              // you also likely want to set up your search listener here.
      
          }
      
          // I'm using ActionBarCompat, in which case
          // calling super after populating the menu is necessary here to ensure that the
          // action bar helpers have a chance to handle this event.
          return super.onCreateOptionsMenu(menu);
      }
      

      【讨论】:

      • 嗨,乔恩,感谢您的帮助。我尝试了其他几个(即android:inputType="phone"),但这些都没有效果。此外,看起来setInputType 是在 API 14 中引入的,我还没有开始支持它。 GRRR
      • 显而易见的解决方案是只自定义EditText,但必须有一种方法可以在没有自定义的情况下做到这一点......
      • 在我看来,如果支持 SearchView 上的输入类型的 java 代码在 API14 之前不存在,那么该对象上的 inputType XML 属性可能也是如此。也许使用 SearchView 中的 inputType 属性为 API14 构建您的应用程序,看看它是否生效?这可能表明这是否准确。
      • ~1 年后,在运行 4.2.1 的 Galaxy Nexus 上进行了测试,它可以工作!不确定它是否可以在 ICS 之前的设备上运行...我会在有机会时报告。
      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2018-07-24
      • 2016-04-27
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多