wake-up-neo.com

Entfernen Sie das SearchIcon als Hinweis im searchView

Ich mache eine Anwendung, bei der ich zum Beispiel auf das Bild klicke (es ist eine Suchansicht). 

enter image description here

das Suchfeld öffnet sich!

und es sieht aus wie enter image description here

hier wird jedoch das Standardsuchsymbol (Lupe) angezeigt, das jedoch verschwindet, sobald Text eingegeben wird

enter image description here

aber ich möchte nicht, dass diese Lupe angezeigt wird, obwohl das Bild zum ersten Mal angeklickt wird

und hier verwende ich keine XML-Datei 

mein Code lautet 

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...");
        }
    }
}
26
Hummer

Ich hatte auch Probleme damit. Ich habe das gefundene Tutorial kombiniert und eine vorhandene Antwort hier in stackoverflow gefunden.

int magId = getResources().getIdentifier("Android:id/search_mag_icon", null, null);
ImageView magImage = (ImageView) searchView.findViewById(magId);
magImage.setLayoutParams(new LinearLayout.LayoutParams(0, 0));

Beachten Sie, dass searchView ein LinearLayout ist. Verwenden Sie LinearLayout.LayoutParams, um eine Ausnahme zu vermeiden.

Ich habe es auch ausprobiert, aber die Ansicht wird dadurch nicht entfernt. Ich kann nicht verstehen warum:

magImage.setVisibility(View.GONE);

Die anderen Ansichten, die Sie ändern müssen, finden Sie in diesem Tutorial unter .

24
chjarder

In meiner App habe ich Android.support.v7.widget.SearchView und zum Ausblenden des Suchsymbols verwendet, das für mich funktioniert hat:

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

Ich habe einfach @null in das searchHintIcon-Attribut gesetzt:

<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
    <item name="searchHintIcon">@null</item>
</style>

und wendete diesen Stil in meinem App-Thema an

<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
    <item name="searchViewStyle">@style/SearchViewMy</item>
</style>

Funktioniert bei mir.

20
Tomask

Versuchen Sie diese drei Zeilen:

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

* Es funktioniert nur für Android.widget.SearchView

13
Silvio Guedes

TL; DR: Wenn Sie den Hinweis von EditText auf die leere Zeichenfolge setzen, genügt es, das Hinweissymbol zu entfernen.

Ich habe eine Antwort gefunden, die tatsächlich funktioniert. Das Ändern des Symbols mithilfe von Reflektionen ist sehr umfangreich - wie z. B. unter Gestaltung der ActionBar-Suchansicht . Diese Website IST ist eine großartige Ressource, aber leider ändert sich der Suchhinweis ImageView nicht (obwohl die Reflektion keine Fehler verursacht). Die einzige Möglichkeit, dieses Bild zu entfernen, war folgende:

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();
}

Sie sollten dies in Ihre onCreateOptionsMenu-Methode einfügen und einen Verweis auf Ihre XML- deklarierte SearchView erhalten, indem Sie Folgendes verwenden:

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
5
Phil

Ich bin gerade auf das gleiche Problem gestoßen, hier sind einige Verweise.

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

Die Taste befindet sich in der folgenden Funktion. Sie legt das Symbol als ImageSpan fest.

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

Verwenden Sie dazu das Attribut "searchHintIcon" in Ihren Stilen:

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

Sie können @null durch beliebige zeichnungsfähige Res ersetzen

2

Es ist die Antwort

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

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

wenn Sie in v7 Widget searchView.setIconifiedByDefault (false) verwenden, unterscheidet sich das Erscheinungsbild der Suchansicht. Sie setzen das Hinweissymbol in xml nur auf @null. Sie können diese Methode auch für andere Symbole anwenden.

0
maniaq

Einfache Lösung ist searchHintIcon Attribut

<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

sie können dies versuchen:

  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