android怎么使用SearchView啊

android怎么使用SearchView啊,第1张

SearchView即时搜索提示功能,主要实现如下:

layout布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<SearchView

android:id="@+id/search_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:iconifiedByDefault="true"

android:inputType="textCapWords"

android:imeOptions="actionSearch"

android:queryHint="" />

</RelativeLayout>

xml中主要配置有四个属性,如下:

android:iconifiedByDefault表示搜索图标是否在输入框内。true效果更加

android:imeOptions设置IME options,即输入法的回车键的功能,可以是搜索、下一个、发送、完成等等。这里actionSearch表示搜索

android:inputType输入框文本类型,可控制输入法键盘样式,如numberPassword即为数字密码样式

android:queryHint输入框默认文本

SearchView的几个主要函数

setOnCloseListener(SearchView.OnCloseListener listener)表示点击取消按钮listener,默认点击搜索输入框

setOnQueryTextListener(SearchView.OnQueryTextListener listener)表示输入框文字listener,包括public boolean onQueryTextSubmit(String query)开始搜索listener,public boolean onQueryTextChange(String newText)输入框内容变化listener,两个函数

java部分实现:

package cn.trinea.android.demo

import java.util.concurrent.Executors

import java.util.concurrent.ScheduledExecutorService

import java.util.concurrent.ScheduledFuture

import java.util.concurrent.TimeUnit

import android.app.ActionBar

import android.app.ActionBar.LayoutParams

import android.app.Activity

import android.content.Context

import android.os.Bundle

import android.os.Handler

import android.os.Message

import android.view.Gravity

import android.view.LayoutInflater

import android.view.MenuItem

import android.view.View

import android.view.WindowManager

import android.widget.SearchView

import android.widget.SearchView.OnCloseListener

import android.widget.Toast

public class SearchViewDemo extends Activity {

private SearchView searchView

private Context context

private MyHandlerhandler

// schedule executor

private ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(10)

private String currentSearchTip

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.search_view_demo)

context = getApplicationContext()

handler = new MyHandler()

ActionBar actionBar = getActionBar()

actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_HOME_AS_UP

| ActionBar.DISPLAY_SHOW_CUSTOM)

setTitle(" ")

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)

View customActionBarView = inflater.inflate(R.layout.search_view_demo_title, null)

searchView = (SearchView)customActionBarView.findViewById(R.id.search_view)

searchView.setIconified(false)

searchView.setOnCloseListener(new OnCloseListener() {

@Override

public boolean onClose() {

// to avoid click x button and the edittext hidden

return true

}

})

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

public boolean onQueryTextSubmit(String query) {

Toast.makeText(context, "begin search", Toast.LENGTH_SHORT).show()

return true

}

public boolean onQueryTextChange(String newText) {

if (newText != null &&newText.length() >0) {

currentSearchTip = newText

showSearchTip(newText)

}

return true

}

})

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL

| Gravity.RIGHT)

actionBar.setCustomView(customActionBarView, params)

// show keyboard

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

}

public void showSearchTip(String newText) {

// excute after 500ms, and when excute, judge current search tip and newText

schedule(new SearchTipThread(newText), 500)

}

class SearchTipThread implements Runnable {

String newText

public SearchTipThread(String newText){

this.newText = newText

}

public void run() {

// keep only one thread to load current search tip, u can get data from network here

if (newText != null &&newText.equals(currentSearchTip)) {

handler.sendMessage(handler.obtainMessage(1, newText + " search tip"))

}

}

}

public ScheduledFuture<?>schedule(Runnable command, long delayTimeMills) {

return scheduledExecutor.schedule(command, delayTimeMills, TimeUnit.MILLISECONDS)

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case android.R.id.home: {

onBackPressed()

return true

}

}

return false

}

private class MyHandler extends Handler {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case 1:

Toast.makeText(context, (String)msg.obj, Toast.LENGTH_SHORT).show()

break

}

}

}

}

上面代码在onQueryTextChange函数即输入框内容每次变化时将一个数据获取线程SearchTipThread放到ScheduledExecutorService中,500ms后执行,在线程执行时判断当前输入框内容和要搜索内容,若相等则继续执行,否则直接返回,避免不必要的数据获取和多个搜索提示同时出现。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE

| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

表示默认输入法d出

编辑框内容为空点击取消的x按钮,编辑框收缩,可在onClose中返回true

Java

1

2

3

4

5

6

7

searchView.setOnCloseListener(new OnCloseListener() {

@Override

public boolean onClose() {

return true

}

})

searchView.onActionViewExpanded()表示在内容为空时不显示取消的x按钮,内容不为空时显示.

searchView.setSubmitButtonEnabled(true)编辑框后显示search按钮,个人建议用android:imeOptions=”actionSearch”代替。

隐藏输入法键盘

InputMethodManager inputMethodManager

inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)

private void hideSoftInput() {

if (inputMethodManager != null) {

View v = SearchActivity.this.getCurrentFocus()

if (v == null) {

return

}

inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),

InputMethodManager.HIDE_NOT_ALWAYS)

searchView.clearFocus()

}

}

其中SearchActivity为Activity的类名

安卓蓝牙中。要连接其他设备要调用connect()函数。。此函数你可以去看一下,官方说的是:若连接成功,就不会产生异常。不成功,就会产生异常。。。所以看看程序会运行异常不。运行了,说明没有连接成功。没运行,则连接成功了。

try {

// 连接

connect(device)

} catch (IOException e) {

Toast.makeText(MainActivity.this, "没有成功连接设备", //1

Toast.LENGTH_SHORT).show()

}

若成功了,不会运行1,不成功,就会产生异常。运行异常中的程序,也就是代码1.

styles.xml设置如下:

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>

<style name="AppTheme.NoActionBar">

<item name="windowActionBar">false</item>

<item name="windowNoTitle">true</item>

<item name="windowActionModeOverlay">true</item>

<item name="android:actionModeBackground">@drawable/context_menu</item>

</style>

<style name="TranslucentTheme" parent="AppTheme.NoActionBar">

</style>

V21的styles.xml设置如下:

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

<style name="AppTheme.NoActionBar">

<item name="windowActionBar">false</item>

<item name="windowNoTitle">true</item>

<item name="android:windowDrawsSystemBarBackgrounds">true</item>

<item name="android:windowContentTransitions">true</item>

<item name="android:statusBarColor">@color/colorPrimary</item>

<item name="windowActionModeOverlay">true</item>

<item name="android:actionModeBackground">@drawable/context_menu</item>

</style>

<style name="TranslucentTheme" parent="AppTheme.NoActionBar">

<item name="android:windowTranslucentStatus">false</item>

<item name="android:windowTranslucentNavigation">false</item>

</style>

再在要显示的toolbar里加上属性:

android:fitsSystemWindows="true"

主题的属性设置为:

<style name="TranslucentTheme" parent="AppTheme.NoActionBar">


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11714736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存