android中search相关的activity到底如何跳转
怪我咯
怪我咯 2017-04-17 11:17:40
[Android讨论组]

读过了android developer上面关于search的那些指南,可是还有些疑问。

1 关于activity之间的关系

搜索涉及到两部分,用户输入和请求处理,那么我想知道用户输入所在的Activity和请求处理所在的Activity是同一个吗?

按照指南,配置搜索的步骤:

1)创建activity

       <activity
            android:name="com.app.maplite.activity.SearchActivity"
            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" />
        </activity>

那么我想知道这个SearchActivity是作为用户输入Activity还是请求处理Activity的?

根据指南说的,系统接到search请求之后将相关数据放入intent然后发送到这个SearchActivity,看样子他是属于请求处理的,如果说是这样的话,那个meat-data要来何用?按照我的理解,meta-data这部分是用来定制搜索框展示情况的,这跟SearchActivity有个毛的关系?

根据我自己的测试,好像用户输入和请求处理必须在同一个Activity里面,如果这样的话,为什么要通过Intent这样的方法来传递搜索数据,这导致Activity的交互啊,真的很麻烦,是我理解有误还是怎么的?

2)我自己的代码有些问题,希望能解答一下。

    <activity
        android:name="com.app.activity.MapActivity"
        android:label="@string/title_activity_map"
        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" />
    </activity>

Activity:

public class MapActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        handleIntent(getIntent());
    }

    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            Log.d("map", "do serach from new intent " + keyword);
            String keyword = intent.getStringExtra(SearchManager.QUERY);
            doSearch(keyword, null);
        }
    }

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

    private void doSearch(String keyword, String type) {
        Log.d("map", "do serach " + keyword);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.u_action_menu_map, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String key) {
                Log.d("map", "query test submit:" + key);
                doSearch(key, null);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String key) {
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

}

运行后,点击搜索“xx”后,会触发多次搜索事件,也就是说

Log.d("map", "do serach " + keyword);

会触发多次,问题我想就是由于Activity跳转引起的吧,但是不知道如何解决。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
阿神

额,我也遇到这个问题,搞了好久,解决了http://segmentfault.com/blog/tcstory/1190000002611886

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号