簡體   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