繁体   English   中英

Android SearchView.OnQueryTextListener() 意外启动 Intent

[英]Android SearchView.OnQueryTextListener() Unexpectedly Launching an Intent

我在我的应用程序中实现了一个 Searchview,但遇到了一个奇怪的问题。 基本上,用户可以输入要搜索的字符串并正确提交。 但是,我的应用程序将根据搜索查询过滤 ListView,然后将启动 Intent,导致活动再次启动并返回到显示所有结果的原始状态。

这是相关的代码。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            updateEntriesView(dbHelper.queryByName(query));
            Toast.makeText(getApplicationContext(), "Searching for " + query, Toast.LENGTH_LONG).show();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
}

private void updateEntriesView(ArrayList<Entry> response) {
    mListView = (ListView) findViewById(R.id.listview_entries);
    if (adapter == null) {
        adapter = new EntryListAdapter(EntriesActivity.this, R.layout.row_entry_layout, response);
        mListView.setAdapter(adapter);
    } else {
        adapter.clear();
        adapter.addAll(response);
        adapter.notifyDataSetChanged();
    }
    adapter.setNotifyOnChange(true);
}

我想不出改变这种行为,我也找不到任何关于它的在线实现的文档。 有没有办法可以覆盖此功能并阻止它启动意图并将活动重新启动到原始未过滤状态?

编辑:
我能够自己解决这个问题。 对于任何可能遇到同样问题的人来说,这是我的解决方案。

所以我在我的 AndroidManifest.xml 中的活动下有一个意图过滤器,它会在搜索操作时启动一个意图。 这就是导致它启动意图并启动我的活动的新实例的原因。

我对此的解决方案是将此活动转换为单个顶级活动并添加代码来处理该意图。 通过将 Activity 设为单顶,它允许 Activity 处理传入的 Intent,而无需启动该 Intent 的新实例。 有关普通活动和单顶活动之间差异的更详细说明,这是一篇关于该主题的好文章https://www.mobomo.com/2011/06/android-understanding-activity-launchmode/

现在,因为我的活动是单顶的,我可以覆盖 onNewIntent() 方法并添加我的代码来处理这个意图,而无需启动新实例。 解决我的问题的相关代码如下。

AndroidManifest.xml

<activity android:name=".EntriesActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable"></meta-data>
</activity>

条目Activity.java

public class EntriesActivity extends AppCompatActivity {
    ...
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        ...
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                updateEntriesView(dbHelper.queryByName(query));
                Toast.makeText(getApplicationContext(), "Searching for " + query, Toast.LENGTH_LONG).show();
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            updateEntriesView(dbHelper.queryEntriesByName(query));
        }
    }

    private void updateEntriesView(ArrayList<Entry> response) {
        if (adapter == null) {
             adapter = new EntryListAdapter(EntriesActivity.this, R.layout.row_entry_layout, response);
            mEntriesList.setAdapter(adapter);
        } else {
            adapter.clear();
            adapter.addAll(response);
            adapter.notifyDataSetChanged();
        }
        adapter.setNotifyOnChange(true);
    }
}

我希望这有帮助。

您需要使用searchView.clearFocus();清除文本视图的焦点searchView.clearFocus(); 请参阅此答案: https//stackoverflow.com/a/15127252/7710739

我知道这是旧的,但如果您的搜索并导致相同的 Activity 尝试删除

    <intent-filter>
    <action android:name="android.intent.action.SEARCH" />
    </intent-filter>

它不应该尝试启动一项新活动,那么我不相信。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM