ActionBar结合SearchView用SearchManager实现系统应用收索

        Android3.之后出现了ActionBar,一种全新的UI设计风格。

       当我们在menu文件下添加配置文件searchview_in_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright (C) 2010 Google Inc.
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          <a target=_blank href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<menu xmlns:android="<a target=_blank href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" >
    <item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"<!--点击收索图标后弹出Searchview控件——>
        android:icon="@android:drawable/ic_menu_search"
        android:showAsAction="always"/>
    <item
        android:icon="@android:drawable/ic_menu_search"
        android:showAsAction="ifRoom|withText"/>
</menu>

在Activity中添加:

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.searchview_in_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        return true;
    }
这样就出现了这样的效果:标题栏旁边出现了两个收索的图标

  但有时候标题栏不够放该怎么办了?我们在配置文件的activity中加入  android:uiOptions="splitActionBarWhenNarrow" 
<activity
            android:name="com.sarchmanager.SearchViewActionBar"
            android:uiOptions="splitActionBarWhenNarrow"
             android:hardwareAccelerated="true"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
然后运行,就成这样了,收缩标致出现了下方:

接下来就是收索的activity了,在android中   Android系统提供了的一种搜索服务,利用此服务可以实现对系统中的应用、联系人、SMS等进行搜索,也提供转入浏览器中的搜索。来查看系统有效的全局搜索SearchManager对象。SearchManager像其他ActivityManager、PackageManager等服务一样,是随系统启动一起启动的服务,并且启动后向ServiceManager注册自己,客户端最终获取搜索服务的途径也是通过binder机制向ServiceManager获取的。

代码中有这样的一个list  :List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();看查源码知道getSearchablesInGlobalSearch()是ISearchManager的方法,ISearchManager是利用AIDL定义的。ISearchManager.Stub的实现类是SearchManagerService,所以真正提供搜索服务的是这个类。serchableinfo 这个对象在初始化之后就不会再修改,再次修改的时候就是在当有程序添加进系统或者被删除时,mSearchables会刷新它里面的信息,也是一个系统级的对像,通过它可以启动系统中有启动界面的所有应用程序。

/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package com.sarchmanager;




import android.app.Activity;
import android.app.SearchManager;
import android.app.SearchableInfo;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;
import android.widget.SearchView;
import android.widget.TextView;


import java.util.List;


import com.example.test.R;




/**
 * This demonstrates the usage of SearchView in an ActionBar as a menu item.
 * It sets a SearchableInfo on the SearchView for suggestions and submitting queries to.
 */
public class SearchViewActionBar extends Activity implements SearchView.OnQueryTextListener {


private SearchView mSearchView;
private TextView mStatusView;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);


setContentView(R.layout.searchview_actionbar);


mStatusView = (TextView) findViewById(R.id.status_text);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);


MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.searchview_in_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchItem.getActionView();
setupSearchView(searchItem);
return true;
}


private void setupSearchView(MenuItem searchItem) {


if (isAlwaysExpanded()) {
mSearchView.setIconifiedByDefault(true);
} else {
searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
}
//     Android系统提供了的一种搜索服务,利用此服务可以实现对系统中的应用、联系人、SMS等进行搜索,也提供转入浏览器中的搜索。
// 来查看系统有效的全局搜索
// SearchManager对象。SearchManager像其他ActivityManager、PackageManager等服务一样,
// 是随系统启动一起启动的服务,并且启动后向ServiceManager注册自己,
// 客户端最终获取搜索服务的途径也是通过binder机制向ServiceManager获取的。
//        搜索服务的入口
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);


if (searchManager != null) {
//看查源码知道getSearchablesInGlobalSearch()是ISearchManager的方法,ISearchManager是利用AIDL定义的。
//ISearchManager.Stub的实现类是SearchManagerService,所以真正提供搜索服务的是这个类。
//serchableinfo 这个对象在初始化之后就不会再修改,其实这个对象还是会修改的,在mSearchables初始化时,
//会向MyPackageMonitor进行注册,这个类的功能就是当有程序添加进系统或者被删除时,mSearchables会刷新它里面的信息。
List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();

// Try to use the "applications" global search provider
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
for (SearchableInfo inf : searchables) {
if (inf.getSuggestAuthority() != null
&& inf.getSuggestAuthority().startsWith("applications")) {
info = inf;
}
}
// 将searchable activity的搜索信息与search view关联
mSearchView.setSearchableInfo(info);
}
//这个可有可无,只是显示textview中的类容
mSearchView.setOnQueryTextListener(this);
}


public boolean onQueryTextChange(String newText) {
mStatusView.setText("Query = " + newText);
Log.d("77777777777777777","1");
return false;
}


public boolean onQueryTextSubmit(String query) {
mStatusView.setText("Query = " + query + " : submitted");
Log.d("77777777777777777","2");
return false;
}


public boolean onClose() {
mStatusView.setText("Closed!");
Log.d("77777777777777777","3");
return false;
}


protected boolean isAlwaysExpanded() {
return false;
}

}

当在输入框输入手机中存在的应用的时候就会出现以下结果:


点击相应的应用就可以进入相应的应用


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值