简体   繁体   English

如何从搜索结果活动中获取结果?

[英]How to get results from search result activity?

I have an Activity (MainActivity) with a search button in the action bar. 我在操作栏中有一个带有搜索按钮的活动(MainActivity)。 It searches by some input string and shows the results in a ListView in another Activity (SearchResultsActivity). 它通过一些输入字符串进行搜索,并在另一个Activity(SearchResultsActivity)的ListView中显示结果。 The user might click in any result to select it. 用户可以单击任何结果以将其选中。

I want to return the value selected by the user to the main activity, but it's not working. 我想将用户选择的值返回给主活动,但是它不起作用。 I looked in the documentation but I didn't find anything related. 我查看了文档,但没有发现任何相关内容。 I tried to use setResult(Intent) in the results activity but the onActivityResult() from the main activity never gets called. 我尝试在结果活动中使用setResult(Intent),但从未调用主活动中的onActivityResult()。

What am I doing wrong? 我究竟做错了什么? How can I do it? 我该怎么做?

AndroidManifest.xml: AndroidManifest.xml中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="foo.bar" >

    <!-- ... -->

    <uses-sdk android:minSdkVersion="11" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">

        <!-- Main Activity -->
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main">

            <meta-data
                android:name="android.app.default_searchable"
                android:value=".SearchResultsActivity" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Search results activity -->
        <activity android:name=".SearchResultsActivity"
            android:parentActivityName=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
    </application>

</manifest>

Menu.xml: menu.xml文件:

<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:context=".MainActivity">

    <!-- Search -->
    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:title="@string/action_search"
        android:showAsAction="always"
        android:actionViewClass="android.widget.SearchView" />

    <!-- ... -->
</menu>

MainActivity: 主要活动:

public class MainActivity extends FragmentActivity {
    // ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        final MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.activity_main_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // never gets called!
        super.onActivityResult(requestCode, resultCode, data);
    }

    // ...
}

SearchResultsActivity: SearchResultsActivity:

public class SearchResultsActivity extends Activity {
    private ListView listResults;

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

        // get the action bar
        ActionBar actionBar = getActionBar();

        // Enabling Back navigation on Action Bar icon
        actionBar.setDisplayHomeAsUpEnabled(true);

        listResults = (ListView) findViewById(R.id.listResults);

        handleIntent(getIntent());
    }

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

    /**
     * Handling intent data
     */
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);

            final Serializable[] results = find(query);

            listResults.setAdapter(new ArrayAdapter<BusLine>(this, R.layout.list_view, busLines));
            listResults.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Serializable selectedResult = (Serializable) parent.getItemAtPosition(position);
                    setResult(RESULT_OK, new Intent().putExtra("result", selectedResult));
                    finish();
                }
            });
        }
    }
}

I can understand why you might think that you would use setResult and onActivityResult to handle clicks in your search results activity, but that is not how it works. 我能理解为什么您可能会认为您将使用setResult和onActivityResult处理搜索结果活动中的点击,但是事实并非如此。 Only when you launch an activity with startActivityForResult do these functions apply -- not when displaying search results. 仅当您使用startActivityForResult启动活动时,这些功能才适用-在显示搜索结果时不适用。

The solution is to call startActivity on your MainActivity in the normal fashion, that is, not using activity results. 解决方案是以常规方式在MainActivity上调用startActivity,即不使用活动结果。 Something like this: 像这样:

listResults.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Serializable selectedResult = (Serializable) parent.getItemAtPosition(position);
        Intent intent = new Intent();
        intent.putExtra("result", selectedResult);
        intent.setClass(SearchResultsActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }
});

Now you will also need to capture this search result in your MainActivity, although you need to make sure you handle the normal case as well as the search results case: 现在,您还需要在MainActivity中捕获此搜索结果,尽管您需要确保处理正常情况以及搜索结果情况:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    if (intent.hasExtra("result")) {
        // Launched from search results
        Serializable selectedResult = (Serializable) intent.getSerializableExtra("result");
        ...
    }
    ...
}

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

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