【问题标题】:How to handle callback from Search Manager?如何处理来自搜索管理器的回调?
【发布时间】:2010-08-30 04:44:34
【问题描述】:

假设如下:

Activity A calls Search Manager
User searches, and search results are displayed in Activity B
User clicks on a list item in Activity B 
App switches back to Activity A

我无法处理从 Activity B 到 Activity A 的回调,因为我没有 Search Manager 意图(我认为?)。

调用搜索管理器(在活动 A 中)

public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.add_symbol:
            onSearchRequested(); //result of search will show Activity B
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

用户选择列表项后返回 Activity A

listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                Quote myQuote = new Quote();
                myQuote.name = (companies.get(position).name);
                myQuote.symbol = (companies.get(position).symbol);

                //TODO: add new quote to master quote list in Main
                //TODO: serialize in Main
                //TODO: go back to last activity

                Intent myIntent = new Intent(getApplicationContext(), Main.class);
                startActivityForResult(myIntent, PICK_COMPANY_REQUEST);
            }
        });

在 Activity A 中处理回调:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICK_COMPANY_REQUEST) {
            if (resultCode == RESULT_OK) {
                Toast toast = Toast.makeText(getApplicationContext(), "Stock added", Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    }

PICK_COMPANY_REQUEST 永远不会发送给回调。为什么是这样?我假设是因为搜索管理器有意图,而不是 Activity B。我怎样才能确保它被调用?

onActivityResult() 永远不会被调用。为什么?

【问题讨论】:

    标签: android android-activity android-intent android-searchmanager


    【解决方案1】:

    我在Android onSearchRequested() callback to the calling activity 上发布了我认为相同问题的答案

    Skythe 没有调用 onActivityResult 是对的,因为 Activity A 没有开始搜索结果。

    为了解决这个问题,我将 Activity A 也定义为可搜索的 Activity(在清单中),以便它接收搜索意图,然后使用 startActivityForResult 手动启动 Activity B,传入查询并让 Activity B正常处理搜索。

    您可以在上面的链接中查看我的回复,或者我有一个more detailed write-up in this blog post

    【讨论】:

      【解决方案2】:

      我真的怀疑您是否需要在 onclickListener 上为 Main 活动调用新意图。 由于活动已经在堆栈中,您可以完成它

      listView.setOnItemClickListener(new OnItemClickListener() {
                  @Override
                  public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                      Quote myQuote = new Quote();
                      myQuote.name = (companies.get(position).name);
                      myQuote.symbol = (companies.get(position).symbol);
      
                      //TODO: add new quote to master quote list in Main
                      //TODO: serialize in Main
                      //TODO: go back to last activity
      
                     //You need to use setresult here and pass the intent
                      setResult(RESULT_OK, myIntent );
                      finish();
                  }
              });
      

      【讨论】:

      • 问题是,onActivityResult() 永远不会被调用。即使我尝试了您的 setResult() 代码。
      • 此问题是否已解决,或者您在此处仍有问题。在使用 setResult 后,您是否还完成()您当前的 Activity 而不调用 Activity A 的意图?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多