2013-12-02 3 views
19

Я делаю приложение, в котором, например, при нажатии на изображение (это SearchView)Удалите SearchIcon, как намек на SearchView

enter image description here

поиск подушечка открывается!

и это выглядит как enter image description here

, но здесь значок поиска по умолчанию (лупа) получает отображаются, но это dissappears как только некоторый текст вводятся

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

Пожалуйста, разместите свой код и xml-файл. –

+0

отправил код @SiddharthVyas – Hummer

ответ

22

У меня были проблемы с этим тоже. Я объединил учебник, который я нашел, и существующий ответ, найденный здесь в 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); 

Для других представлений, которые необходимо изменить, см to this tutorial.

+3

Я получаю NPE на 'magImage.setLayoutParams (новый LinearLayout .LayoutParams (0, 0)); 'что означает, что' magImage' является нулевым, хотя я не могу понять, почему :-( – Solace

+1

, но в v7.SearchWidget мы не можем скрыть значок searchhint этим методом. Просто сделайте одно, получить экземпляр SearchView, просто проверьте, что вы не пишете searchView.setIconifiedByDefault (false); метод –

+1

Для сопоставления приложений [см.] (http://stackoverflow.com/questions/29633952/how-to-delete-or- change-the-searchview-icon-inside-the-searchview-actionbar/33229228 # 33229228) – Sarasranglt

0

вы можете попробовать это:

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

Куда я должен поместить этот @HarshitRathi – Hummer

+0

при запуске поиска в edittext, тогда установите это ... –

+0

извините, приятель, я не понимаю вас, весь код, который я написал, и просто отправьте комментарий с кодом, добавляющим вышеуказанные строки, пожалуйста, – Hummer

5

TL; DR: Просто установив подсказку EditText «с, чтобы пустая строка достаточно, чтобы удалить значок подсказки.

Я нашел ответ, который действительно работает. Есть много вещей об изменении значка с использованием отражения - например, обсуждалось в Styling the ActionBar SearchView. Этот сайт IS отличный ресурс, но, к сожалению, подсказка поиска 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 -declared SearchView используя что-то вроде:

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
+0

Это решение работает! –

4

Я только что встретил ту же проблему, вот некоторые ссылки ссылки.

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; 
} 
14

Я просто поставил @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> 

работает для меня.

+0

Простые и прямые. –

1

Использование «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 с любым рисуемым Резом вы хотите

19

В моем приложении я использовал android.support.v7.widget.SearchView и скрыть значок поиска это работает для меня:

<android.support.v7.widget.SearchView 
    ... 
    app:iconifiedByDefault="false" 
    app:searchIcon="@null" 
/> 
+0

Это работает для меня.Длительное обсуждение заставляет меня беспокоиться о том, насколько совместимо это решение с другим оборудованием, но оно на сегодняшний день является самым чистым. –

+1

Программно также возможно: searchView.setIconifiedByDefault (false); –

8

Попробуйте эти три линии:

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

* Он работает только для android.widget.SearchView

+0

хороший ответ, его работа. –

+0

Но это работает только для уровня API 21 и выше. – Aashish

Смежные вопросы