たとえば、画像をクリックするとアプリケーションが実行されます(searchViewです)
検索パッドが開きます!
そしてそれは次のように見えます
ただし、ここではデフォルトの検索アイコン(拡大鏡)が表示されますが、テキストが入力されるとすぐに消えます
しかし、画像が初めてクリックされても、その拡大鏡を表示したくない
そして、ここで私はXMLファイルを使用していません
私のコードは
public class MainActivity extends Activity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relative = new RelativeLayout(this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
relative.setLayoutParams(params);
setContentView(relative);
SearchView searchView = new SearchView(this);
traverseView(searchView, 0);
// searchView.setIconifiedByDefault(false);
LayoutParams searchViewparams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
// searchViewparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
searchView.setLayoutParams(searchViewparams);
relative.addView(searchView);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
private void traverseView(View view, int index) {
if (view instanceof SearchView) {
SearchView v = (SearchView) view;
for(int i = 0; i < v.getChildCount(); i++) {
traverseView(v.getChildAt(i), i);
}
} else if (view instanceof LinearLayout) {
LinearLayout ll = (LinearLayout) view;
for(int i = 0; i < ll.getChildCount(); i++) {
traverseView(ll.getChildAt(i), i);
}
} else if (view instanceof EditText) {
((EditText) view).setTextColor(Color.GREEN);
((EditText) view).setHintTextColor(Color.BLACK);
} else if (view instanceof TextView) {
((TextView) view).setTextColor(Color.BLUE);
} else if (view instanceof ImageView) {
((ImageView) view).setImageResource(R.drawable.ic_launcher);
} else {
Log.v("View Scout", "Undefined view type here...");
}
}
}
私もこれに問題がありました。私が見つけたチュートリアルと、ここで見つけた既存の答えをstackoverflowで組み合わせました。
int magId = getResources().getIdentifier("Android:id/search_mag_icon", null, null);
ImageView magImage = (ImageView) searchView.findViewById(magId);
magImage.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
SearchViewはLinearLayoutであるため、LinearLayout.LayoutParamsを使用して例外を回避してください。
私もこれを試しましたが、ビューは削除されません。理由がわからないようです:
magImage.setVisibility(View.GONE);
変更する必要がある他のビューについては、 このチュートリアルを参照 を参照してください
私のアプリではAndroid.support.v7.widget.SearchView
そしてこれが私のために働いた検索アイコンを非表示にする:
<Android.support.v7.widget.SearchView
...
app:iconifiedByDefault="false"
app:searchIcon="@null"
/>
単純に@ nullをsearchHintIcon
属性に追加しました:
<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
<item name="searchHintIcon">@null</item>
</style>
アプリのテーマにそのスタイルを適用しました
<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
<item name="searchViewStyle">@style/SearchViewMy</item>
</style>
私のために働く。
次の3行を試してください。
Android:iconifiedByDefault="false"
Android:searchIcon="@null"
Android:searchHintIcon="@null"
* Android.widget.SearchViewでのみ機能します
TL; DR:EditText
のヒントを空の文字列に設定するだけで、ヒントアイコンを削除できます。
実際に機能する答えを見つけました。 ActionBar SearchViewのスタイル設定 で説明されているように、リフレクションを使用してアイコンを変更する方法はたくさんあります。このWebサイト[〜#〜] [〜#〜]は素晴らしいリソースですが、残念ながら検索ヒントImageView
は変わりません(リフレクションは変わりませんがエラーが発生します)。この画像を削除できる唯一の方法は次のとおりです。
try {
int searchPlateId = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);
searchPlate.setHint("");
}
catch (Throwable t)
{
t.printStackTrace();
}
これをonCreateOptionsMenu
メソッドに配置し、次のようなものを使用してXML
で宣言されたSearchView
への参照を取得する必要があります。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
私はちょうど同じ問題に出会いました、ここにいくつかの参照リンクがあります。
http://blog.luxteam.net/2013/11/04/styling-appcompat-searchview/
キーは次の関数にあり、アイコンをImageSpan
として設定します。
private CharSequence getDecoratedHint(CharSequence hintText) {
// If the field is always expanded, then don't add the search icon to the hint
if (!mIconifiedByDefault) return hintText;
SpannableStringBuilder ssb = new SpannableStringBuilder(" "); // for the icon
ssb.append(hintText);
Drawable searchIcon = getContext().getResources().getDrawable(getSearchIconId());
int textSize = (int) (mQueryTextView.getTextSize() * 1.25);
searchIcon.setBounds(0, 0, textSize, textSize);
ssb.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return ssb;
}
そのためには、スタイルで「searchHintIcon」属性を使用します。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="searchViewStyle">@style/AppTheme.SearchView</item>
</style>
<style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
<item name="searchHintIcon">@null</item>
</style>
@nullを必要な描画可能な解像度に置き換えることができます
答えです
ImageView searchViewIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_mag_icon);
ViewGroup linearLayoutSearchView =(ViewGroup) searchViewIcon.getParent();
linearLayoutSearchView.removeView(searchViewIcon);
v7 Widgetでは、searchView.setIconifiedByDefault(false)を使用すると、検索ビューの動作が異なります。 xmlでヒントアイコンを@nullに設定するだけです。また、この方法を他のアイコンに適用できます。
簡単な解決策はsearchHintIcon属性です
<style name="SearchViewStyleMyApp" parent="Widget.AppCompat.SearchView">
<!-- Background for the search query section (e.g. EditText) -->
<item name="queryBackground">@Android:color/white</item>
<!-- note that this is how you style your hint icon -->
<item name="searchHintIcon">@null</item>
<!-- The hint text that appears when the user has not typed anything -->
<item name="queryHint">@string/search_hint</item>
</style>
これを試すことができます:
public class MainActivity extends Activity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relative = new RelativeLayout(this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
relative.setLayoutParams(params);
setContentView(relative);
SearchView searchView = new SearchView(this);
searchView.setIconifiedByDefault(false);
traverseView(searchView, 0);
// searchView.setIconifiedByDefault(false);
LayoutParams searchViewparams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
// searchViewparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
searchView.setLayoutParams(searchViewparams);
relative.addView(searchView);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
private void traverseView(View view, int index) {
if (view instanceof SearchView) {
SearchView v = (SearchView) view;
for(int i = 0; i < v.getChildCount(); i++) {
traverseView(v.getChildAt(i), i);
}
} else if (view instanceof LinearLayout) {
LinearLayout ll = (LinearLayout) view;
for(int i = 0; i < ll.getChildCount(); i++) {
traverseView(ll.getChildAt(i), i);
}
} else if (view instanceof EditText) {
((EditText) view).setTextColor(Color.GREEN);
((EditText) view).setHintTextColor(Color.BLACK);
} else if (view instanceof TextView) {
((TextView) view).setTextColor(Color.BLUE);
} else if (view instanceof ImageView) {
((ImageView) view).setImageResource(R.drawable.ic_launcher);
} else {
Log.v("View Scout", "Undefined view type here...");
}
}
}