web-dev-qa-db-ja.com

searchViewのヒントとしてSearchIconを削除します

たとえば、画像をクリックするとアプリケーションが実行されます(searchViewです)

enter image description here

検索パッドが開きます!

そしてそれは次のように見えます enter image description here

ただし、ここではデフォルトの検索アイコン(拡大鏡)が表示されますが、テキストが入力されるとすぐに消えます

enter image description here

しかし、画像が初めてクリックされても、その拡大鏡を表示したくない

そして、ここで私は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...");
        }
    }
}
28
Hummer

私もこれに問題がありました。私が見つけたチュートリアルと、ここで見つけた既存の答えを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);

変更する必要がある他のビューについては、 このチュートリアルを参照 を参照してください

27
chjarder

私のアプリではAndroid.support.v7.widget.SearchViewそしてこれが私のために働いた検索アイコンを非表示にする:

<Android.support.v7.widget.SearchView
    ...
    app:iconifiedByDefault="false"
    app:searchIcon="@null"
/>
42
Armin

単純に@ nullsearchHintIcon属性に追加しました:

<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>

私のために働く。

22
Tomask

次の3行を試してください。

Android:iconifiedByDefault="false"
Android:searchIcon="@null"
Android:searchHintIcon="@null"

* Android.widget.SearchViewでのみ機能します

17
Silvio Guedes

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();
5
Phil

私はちょうど同じ問題に出会いました、ここにいくつかの参照リンクがあります。

http://blog.luxteam.net/2013/11/04/styling-appcompat-searchview/

https://Android.googlesource.com/platform/frameworks/support.git/+/Android-support-lib-19.1.0/v7/appcompat/src/Android/support/v7/widget/SearchView。 Java

キーは次の関数にあり、アイコンを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;
}
4
Chao Zhang

そのためには、スタイルで「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を必要な描画可能な解像度に置き換えることができます

2

答えです

ImageView searchViewIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_mag_icon);

ViewGroup linearLayoutSearchView =(ViewGroup) searchViewIcon.getParent();
linearLayoutSearchView.removeView(searchViewIcon);
2

v7 Widgetでは、searchView.setIconifiedByDefault(false)を使用すると、検索ビューの動作が異なります。 xmlでヒントアイコンを@nullに設定するだけです。また、この方法を他のアイコンに適用できます。

0
maniaq

簡単な解決策は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>
0
Rahul

これを試すことができます:

  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...");
            }
        }
    }
0
Harshit Rathi