我在Action Bar中有一个Search Widget。我已经设置了一个android:提示值但是当我点击搜索图标时它没有显示出来。
相关文件:
MainActivity.java
package com.example.myApp;
import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.view.Menu;
import android.widget.SearchView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//creates an action bar.
ActionBar actionBar = getActionBar();
//sets the homebutton.
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
}
Main.xml => RES /菜单/ main.xml中
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="@string/search_title"
android:icon="@drawable/ic_search"
android:showAsAction="collapseActionView|ifRoom"
android:actionViewClass="android.widget.SearchView"
/>
</menu>
searchable.xml =&gt; RES / XML / searchable.XMl
<?xml version="1.0" encoding="UTF-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="search"
android:textColorHint= "#FF0000"
/>
Mainfest.XMl
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.MyApp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.MyApp.MainActivity"
android:label="@string/app_name" >
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我的尝试:
我的操作栏有黑色背景,所以我假设我最初看不到:提示值,因为提示文字颜色是黑色也是如此。但是,即使在更改了hintTextColor之后,我仍然看不到提示值。
有什么想法吗?
感谢。
答案 0 :(得分:23)
出于某种原因,您需要在标记中添加<action android:name="android.intent.action.SEARCH"/>
。这就是为我解决问题的原因。
但要小心按此顺序排列
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
否则您的活动将不会被识别为启动器
答案 1 :(得分:18)
还没有人能回答我的问题......
我找到了一种方法来更改.java文件中的提示值,但不能更改 .xml 文件中的提示值。
在onCreateOptionsMenu(Menu menu)
的{{1}}方法中,我可以这样做:
MainActivity.java
我相信我仍然可以在XML中预设一个SearchWidget的提示值,就像一个简单的searchView.setQueryHint("HINT TEXT...");
一样。
答案 2 :(得分:14)
您必须为提示属性提供字符串资源。硬编码文本无效。而不是
android:hint="search"
使用字符串资源
android:hint="@string/search_hint"
文档很明确:http://developer.android.com/guide/topics/search/searchable-config.html
android:hint="string resource"
答案 3 :(得分:13)
如果您想跳到解决方案,只需向下滚动
这似乎是SearchView
中的错误。
编辑:我报告了此错误here。 编辑2:对于将来的版本似乎已修复,请参阅here。
在构造函数中,它为字段mQueryHint
分配值。
public SearchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
...
final CharSequence queryHint = a.getText(R.styleable.SearchView_queryHint);
if (!TextUtils.isEmpty(queryHint)) {
setQueryHint(queryHint);
}
...
}
public void setQueryHint(CharSequence hint) {
mQueryHint = hint;
updateQueryHint();
}
稍后,当您设置SearchableInfo
(您知道它应该从中读取提示的对象)时,会发生以下情况:
public void setSearchableInfo(SearchableInfo searchable) {
mSearchable = searchable;
if (mSearchable != null) {
...
updateQueryHint();
}
...
}
直到现在一切似乎还好。它会将searchableInfo
保存在名为mSearchable
的字段中。让我们看看updateQueryHint
做了什么:
private void updateQueryHint() {
if (mQueryHint != null) {
mSearchSrcTextView.setHint(getDecoratedHint(mQueryHint));
} else if (IS_AT_LEAST_FROYO && mSearchable != null) {
CharSequence hint = null;
int hintId = mSearchable.getHintId();
if (hintId != 0) {
hint = getContext().getString(hintId);
}
if (hint != null) {
mSearchSrcTextView.setHint(getDecoratedHint(hint));
}
} else {
mSearchSrcTextView.setHint(getDecoratedHint(""));
}
}
什么?因此,如果mQueryHint
已经有值,我们甚至从未阅读过可搜索的信息?这就解释了为什么我们永远不会看到我们的提示,因为mQueryHint
被分配给SearchView构造函数中的默认值(见上文)。
那么我们如何解决这个错误呢?
两个选项:
示例:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the options menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.your_menu, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
// Assumes current activity is the searchable activity
SearchableInfo searchableInfo = searchManager.getSearchableInfo(getComponentName());
searchView.setSearchableInfo(searchableInfo);
// Override the hint with whatever you like
searchView.setQueryHint(getResources().getString(R.strings.your_hint));
return true;
}
示例:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the options menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.your_menu, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
// Assumes current activity is the searchable activity
SearchableInfo searchableInfo = searchManager.getSearchableInfo(getComponentName());
// DO THIS BEFORE setSearchableInfo !!!
searchView.setQueryHint(null);
searchView.setSearchableInfo(searchableInfo);
return true;
}
两人都确认使用appcompat v7。
答案 4 :(得分:2)
您可以使用
android:queryHint="Hint text"
在XML中的搜索窗口小部件中。
答案 5 :(得分:2)
接受的答案确实有效,但仅适用于MAIN活动。如果你想在另一个活动中使用它,它将无法工作。
以下代码取自android developer site
<activity
android:name="com.example.Activities.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>