Android Search功能全面实现Demo

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Android应用中的"android sreach demo"是一个展示搜索功能的示例项目,它提供了基本的搜索功能并支持保存与删除搜索记录,方便用户管理查找历史搜索内容。项目深入讲解了关键知识点,包括SearchView使用、Intent处理、搜索服务配置、搜索历史存储、记录删除、快速删除操作、RecyclerView适配器、数据持久化技术、UI设计、事件监听和权限管理。本示例对理解和学习Android搜索功能的实现具有重要作用。 android sreach demo

1. SearchView实现与SearchManager配置

SearchView实现

在Android开发中, SearchView 是一个常用的组件,用于实现搜索功能。要实现一个基本的 SearchView ,你需要在布局文件中定义一个 SearchView ,然后在Activity或Fragment中进行初始化和配置。

<SearchView
    android:id="@+id/search_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

在Java代码中,你可以这样获取和配置 SearchView

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SearchView searchView = (SearchView) findViewById(R.id.search_view);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    // 获取SearchView的菜单项并配置SearchableInfo
    searchView.setOnSearchClickListener(new SearchView.OnSearchClickListener() {
        @Override
        public void onSearchClick(boolean queryString) {
            // 获取SearchableInfo对象并设置给SearchView
            ComponentName componentName = new ComponentName(MainActivity.this, SearchActivity.class);
            SearchableInfo searchableInfo = searchManager.getSearchableInfo(componentName);
            searchView.setSearchableInfo(searchableInfo);
        }
    });
}

SearchManager配置

SearchManager 是Android系统提供的一个服务,用于管理搜索相关的操作。要使用 SearchManager ,你需要在 AndroidManifest.xml 中声明搜索配置。

<searchable xmlns:android="***"
    android:label="@string/app_name"
    android:searchSuggestAuthority="com.example.app.searchprovider" />

然后在Activity中获取 SearchManager 服务,并将其与 SearchView 关联起来。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SearchView searchView = (SearchView) findViewById(R.id.search_view);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    ComponentName componentName = new ComponentName(MainActivity.this, SearchActivity.class);
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(componentName);
    searchView.setSearchableInfo(searchableInfo);

    // 设置监听器,处理搜索事件
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // 处理提交的查询
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            // 处理文本变化事件
            return false;
        }
    });
}

通过上述步骤,你就可以实现一个基本的搜索功能,并且能够响应用户输入的查询了。接下来,我们将深入探讨如何使用 Intent IntentFilter 来实现更复杂的交互逻辑。

2. Intent使用与IntentFilter定义

2.1 Intent的基本使用

2.1.1 Intent的创建和传递数据

在Android开发中,Intent是用于组件之间进行交互的一种机制,它可以启动一个Activity、Service或者BroadcastReceiver。Intent对象可以携带数据,这些数据可以是基本数据类型,也可以是实现了Serializable或Parcelable接口的对象。

创建一个Intent对象并传递数据的基本步骤如下:

  1. 创建一个新的Intent对象,指定当前的Context和目标Activity。
  2. 使用 putExtra 方法添加需要传递的数据。
  3. 启动目标Activity。

以下是一个简单的例子:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
intent.putExtra("key", "value");
startActivity(intent);

TargetActivity 中,可以使用 getIntent 方法来获取传递过来的数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    Intent intent = getIntent();
    String value = intent.getStringExtra("key");
}

2.1.2 Intent的解析和结果获取

当一个Activity需要返回结果给调用它的Activity时,可以通过 startActivityForResult 方法启动目标Activity,并在目标Activity中调用 setResult 方法来返回结果。

以下是在调用Activity中获取结果的步骤:

  1. 使用 startActivityForResult 方法启动目标Activity。
  2. 重写 onActivityResult 方法来处理返回的结果。

以下是一个简单的例子:

public class CallerActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_caller);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(CallerActivity.this, TargetActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            String result = data.getStringExtra("result");
            // 处理返回的结果
        }
    }
}

TargetActivity 中返回结果的代码如下:

public class TargetActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("result", "这是返回的结果");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

2.2 IntentFilter的定义和作用

2.2.1 IntentFilter的创建和注册

IntentFilter用于描述一个组件(如Activity、Service、BroadcastReceiver)所能够响应的Intent类型。它通常在AndroidManifest.xml文件中或代码中注册。

在AndroidManifest.xml文件中注册IntentFilter的示例:

<activity android:name=".MyActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

在代码中动态注册IntentFilter的示例:

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_VIEW);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.setDataScheme("http");
registerReceiver(myReceiver, filter);

2.2.2 IntentFilter的匹配规则

IntentFilter的匹配规则决定了它是否能够响应特定的Intent。匹配规则包括action、category和data。

  • Action : Intent的action是一个字符串,用于描述Intent的目的。IntentFilter可以指定一个或多个action,只有当Intent的action与之一致时,才能匹配该IntentFilter。
  • Category : Intent的category是一个字符串,用于描述使用Intent的上下文。IntentFilter可以指定一个或多个category,只有当Intent的category与之一致时,才能匹配该IntentFilter。
  • Data : Intent的数据可以是URI和MIME类型。IntentFilter可以指定URI的scheme、host、port、path等,也可以指定MIME类型。只有当Intent的数据与IntentFilter的data规则一致时,才能匹配该IntentFilter。

以下是一个匹配规则的示例:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="image/*" android:scheme="http" android:host="***" />
</intent-filter>

在这个例子中,只有当Intent的action为 android.intent.action.VIEW ,category包含 android.intent.category.DEFAULT ,并且数据的MIME类型为 image/* ,URI的scheme为 http ,host为 *** 时,才能匹配这个IntentFilter。

【本章节介绍】

通过本章节的介绍,我们了解了Intent的基本使用方法,包括如何创建Intent对象,如何传递数据以及如何解析返回的结果。此外,我们还学习了IntentFilter的定义和作用,以及如何创建和注册IntentFilter,以及IntentFilter的匹配规则。这些知识对于我们在Android应用开发中实现组件间的通信和数据交互是至关重要的。

3. Searchable Configuration配置

3.1 Searchable Configuration的概念和作用

3.1.1 Searchable Configuration的创建

Searchable Configuration是Android中用于实现搜索功能的一种配置文件,它定义了搜索操作的各种属性,如搜索提示、搜索建议等。在AndroidManifest.xml中,可以通过 标签来创建Searchable Configuration。

<searchable xmlns:android="***"
    android:label="@string/app_name"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.searchsuggestprovider">
</searchable>

在上述代码中, android:label 定义了搜索框上方显示的标题, android:hint 定义了搜索框内的提示文字, android:searchSuggestAuthority 定义了搜索建议的提供者。

3.1.2 Searchable Configuration的配置和使用

配置好Searchable Configuration后,需要在对应的Activity中使用它。这通常通过在Activity的onCreateOptionsMenu()方法中初始化SearchView,并将其与Searchable Configuration绑定来实现。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setSearchableInfo(getSearchableInfo());
    return super.onCreateOptionsMenu(menu);
}

在上述代码中, getSearchableInfo() 方法返回一个SearchableInfo对象,该对象包含了Searchable Configuration的各种配置信息。

3.2 Searchable Configuration与SearchView的关联

3.2.1 SearchView的获取和设置

SearchView是Android中用于提供搜索功能的视图组件。在Activity中获取和设置SearchView主要通过以下步骤完成:

  1. 在onCreateOptionsMenu()方法中获取SearchView对象。
  2. 使用setSearchableInfo()方法将SearchView与Searchable Configuration关联。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setSearchableInfo(getSearchableInfo());
    return super.onCreateOptionsMenu(menu);
}

3.2.2 Searchable Configuration与SearchView的绑定

在Searchable Configuration创建好后,我们需要将其与SearchView绑定,以便实现搜索功能。

private SearchableInfo getSearchableInfo() {
    ComponentName componentName = new ComponentName(this, MySearchableActivity.class);
    return new SearchableInfo.Builder()
            .setSearchSuggestAuthority("com.example.searchsuggestprovider")
            .setSearchableInfo(new ComponentName(this, componentName))
            .build();
}

在上述代码中, getSearchableInfo() 方法返回一个SearchableInfo对象,该对象包含了Searchable Configuration的各种配置信息。通过这种方式,SearchView就可以利用Searchable Configuration提供的配置信息来执行搜索操作。

在本章节中,我们介绍了Searchable Configuration的基本概念和作用,以及如何创建和配置Searchable Configuration。同时,我们也讲解了如何将Searchable Configuration与SearchView关联和绑定,以便实现搜索功能。通过这些步骤,我们可以为Android应用添加强大的搜索功能,提高用户体验。

4. 搜索历史记录存储

在本章节中,我们将探讨如何在Android应用中存储和管理搜索历史记录。这包括了解不同存储方式的优缺点,实现搜索历史记录的添加和删除,以及如何优化用户体验。

4.1 搜索历史记录的存储方式

4.1.1 数据库存储

数据库是存储搜索历史记录的一种常见方式。它允许我们轻松地进行增删改查操作,并且能够处理大量数据。在Android中,我们可以使用SQLite数据库来实现这一功能。以下是使用SQLite数据库存储搜索历史记录的基本步骤:

  1. 创建数据库和表 :首先,我们需要创建一个数据库以及一个表格来存储搜索历史记录。这个表格通常包含两个字段:ID和搜索词。
CREATE TABLE search_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    keyword TEXT NOT NULL
);
  1. 插入数据 :每当用户进行搜索时,我们将搜索词插入到表格中。
ContentValues values = new ContentValues();
values.put("keyword", keyword);
getContentResolver().insert(SearchHistoryProvider.CONTENT_URI, values);
  1. 查询数据 :为了显示搜索历史记录,我们需要从数据库中查询数据。
Cursor cursor = getContentResolver().query(
    SearchHistoryProvider.CONTENT_URI,
    null,
    null,
    null,
    null
);

4.1.2 文件存储

如果搜索历史记录量不大,或者不想引入数据库的复杂性,可以使用文件存储的方式。以下是使用SharedPreferences文件存储搜索历史记录的基本步骤:

  1. 存储数据 :将搜索历史记录存储在一个字符串中,每个搜索词之间用分隔符分隔。
SharedPreferences sharedPreferences = getSharedPreferences("SearchHistory", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
String keywords = TextUtils.join(";", searchHistoryList);
editor.putString("searchHistory", keywords);
editor.apply();
  1. 读取数据 :从SharedPreferences中读取搜索历史记录。
SharedPreferences sharedPreferences = getSharedPreferences("SearchHistory", MODE_PRIVATE);
String keywords = sharedPreferences.getString("searchHistory", "");
String[] searchHistoryList = TextUtils.split(keywords, ";");

4.1.3 比较分析

数据库存储方式提供了更强大的数据处理能力,适合复杂的应用场景。文件存储方式则更为简单轻量,适合数据量不大的简单应用场景。在选择存储方式时,需要根据实际需求和预期数据量进行权衡。

4.1.4 表格:存储方式比较

| 存储方式 | 优点 | 缺点 | 适用场景 | | --- | --- | --- | --- | | 数据库 | 高效的增删改查操作,支持大量数据 | 数据库管理相对复杂 | 需要频繁进行搜索历史记录操作,数据量大 | | 文件存储 | 简单轻量 | 功能有限,不适合大量数据 | 数据量小,操作简单 |

4.2 搜索历史记录的管理

4.2.1 搜索历史记录的添加

添加搜索历史记录是用户每次搜索后都需要进行的操作。以下是一个简单的实现逻辑:

  1. 用户进行搜索 :用户在搜索框中输入搜索词并提交搜索请求。
  2. 存储搜索历史 :将搜索词添加到存储介质中。
  3. 显示搜索历史 :更新界面上的搜索历史记录列表。
public void addSearchHistory(String keyword) {
    // 从存储介质中获取现有的搜索历史记录
    List<String> searchHistoryList = getSearchHistory();
    // 添加新的搜索词
    searchHistoryList.add(keyword);
    // 重新存储搜索历史记录
    saveSearchHistory(searchHistoryList);
    // 更新界面上的搜索历史记录列表
    updateSearchHistoryList();
}

4.2.2 搜索历史记录的删除

删除搜索历史记录可以是单个删除,也可以是清空所有记录。以下是删除搜索历史记录的逻辑:

  1. 选择删除方式 :用户可以选择删除单个搜索词或者清空所有搜索历史记录。
  2. 执行删除操作 :根据用户的选择执行相应的删除操作。
  3. 更新界面显示 :删除操作后,更新界面上的搜索历史记录列表。
public void deleteSearchHistory(String keyword) {
    // 从存储介质中获取现有的搜索历史记录
    List<String> searchHistoryList = getSearchHistory();
    // 删除指定的搜索词
    searchHistoryList.remove(keyword);
    // 重新存储搜索历史记录
    saveSearchHistory(searchHistoryList);
    // 更新界面上的搜索历史记录列表
    updateSearchHistoryList();
}

public void clearSearchHistory() {
    // 清空所有搜索历史记录
    List<String> searchHistoryList = new ArrayList<>();
    // 重新存储搜索历史记录
    saveSearchHistory(searchHistoryList);
    // 更新界面上的搜索历史记录列表
    updateSearchHistoryList();
}

4.2.3 优化用户体验

为了提升用户体验,我们应该提供快捷方便的搜索历史管理功能。例如,提供搜索历史记录的自动补全、搜索历史记录的排序显示等功能。

// 自动补全搜索历史记录
public List<String> autocompleteSearchHistory(String query) {
    List<String> searchHistoryList = getSearchHistory();
    List<String> suggestions = new ArrayList<>();
    for (String keyword : searchHistoryList) {
        if (keyword.toLowerCase().contains(query.toLowerCase())) {
            suggestions.add(keyword);
        }
    }
    return suggestions;
}

4.2.4 表格:管理操作比较

| 操作 | 说明 | 代码示例 | | --- | --- | --- | | 添加搜索历史 | 将搜索词添加到存储介质 | public void addSearchHistory(String keyword) | | 删除搜索历史 | 删除指定搜索词或清空所有记录 | public void deleteSearchHistory(String keyword) public void clearSearchHistory() | | 自动补全 | 根据用户输入提供搜索历史建议 | public List<String> autocompleteSearchHistory(String query) |

通过本章节的介绍,我们了解了在Android应用中如何存储和管理搜索历史记录。我们讨论了不同存储方式的优缺点,实现了搜索历史记录的添加和删除操作,并探讨了如何优化用户体验。在实际开发中,开发者应根据应用的具体需求选择合适的存储和管理策略。

5. 搜索记录删除与快速删除操作

在本章中,我们将深入探讨如何实现搜索记录的删除操作,并在此基础上实现一个用户友好的快速删除功能。首先,我们会了解删除搜索记录的基本方法,然后分析快速删除操作的设计与实现。

5.1 搜索记录的删除操作

在用户界面上,提供一个清晰的删除搜索记录的选项是常见的做法,以帮助用户管理他们的历史记录。以下是实现这一功能的基本步骤。

5.1.1 搜索记录的删除方法

在实现删除方法之前,需要确定搜索记录的存储方式。通常情况下,搜索记录会被保存在数据库中。以下是一个删除操作的示例代码:

public void deleteRecordFromDatabase(String query) {
    // 假设mDatabase是已经初始化的SQLiteDatabase对象
    String selection = "query_text = ?";
    String[] selectionArgs = { query };
    mDatabase.delete("search_history", selection, selectionArgs);
}

在这段代码中,我们通过SQL的DELETE语句来删除数据库中与特定查询字符串匹配的记录。这个操作需要谨慎执行,因为一旦执行,相关的数据将不可恢复。

5.1.2 搜索记录删除的效果和反馈

在用户触发删除操作后,除了执行删除命令,还需要给用户一个明确的反馈。通常这可以通过简单地刷新显示搜索历史的UI组件来实现,如下:

void refreshSearchHistoryUI() {
    // 假设mAdapter是RecyclerView的适配器
    mAdapter.notifyDataSetChanged();
}

这里的 notifyDataSetChanged() 方法会使适配器重新从数据源加载数据,并更新UI显示。确保UI能即时反映数据的变化是提供良好用户体验的关键。

5.2 快速删除操作的实现

快速删除是搜索历史记录中更为便捷的删除方式,通常情况下用户会希望一次性删除多个搜索记录。这种情况下,我们需要提供一个界面允许用户选择他们想要删除的记录。

5.2.1 快速删除操作的设计

快速删除操作的设计需要包括以下几个方面:

  • 一个选择器界面,让用户可以多选他们想要删除的搜索记录。
  • 一个确认删除操作的步骤,以防止用户误操作。
  • 一个删除操作的反馈,告知用户有多少记录被成功删除。

下面是一个实现快速删除操作的简单框架:

public void performQuickDelete(List<String> selectedQueries) {
    // 遍历选中的查询记录并进行删除操作
    for (String query : selectedQueries) {
        deleteRecordFromDatabase(query);
    }
    // 刷新UI以反映删除操作的结果
    refreshSearchHistoryUI();
}

5.2.2 快速删除操作的实现和测试

实现快速删除操作时需要确保以下几个测试点:

  • 检查是否能正确识别用户选中的记录。
  • 验证在删除操作中删除了正确的记录。
  • 测试界面反馈是否准确地反映了删除操作的结果。
  • 确保在删除操作后没有发生应用程序崩溃。

对于上述功能的实现,我们需要有一个界面上的复选框供用户选择他们想要删除的记录。在用户选择完毕后,确认删除的操作应当被触发,并执行删除逻辑。

通过这一系列的步骤,我们可以实现一个既方便用户操作又安全的搜索记录删除功能。快速删除功能的引入,大大提升了用户体验,使得用户可以更加轻松地管理他们的搜索历史。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Android应用中的"android sreach demo"是一个展示搜索功能的示例项目,它提供了基本的搜索功能并支持保存与删除搜索记录,方便用户管理查找历史搜索内容。项目深入讲解了关键知识点,包括SearchView使用、Intent处理、搜索服务配置、搜索历史存储、记录删除、快速删除操作、RecyclerView适配器、数据持久化技术、UI设计、事件监听和权限管理。本示例对理解和学习Android搜索功能的实现具有重要作用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值