2017-02-22 15 views
0

Я пытаюсь настроить свою панель поиска на Android Studio для своего приложения. Результат, который я хотел бы получить, следующий: My Search bar and the Quora's oneStyling Search View на Android (min21)

Я стараюсь следовать документации G (https://developer.android.com/guide/topics/search/search-dialog.html) без каких-либо результатов.

Вот мой код:

styles.xml

<style name="CustomSearchViewStyle" parent="Widget.AppCompat.SearchView"> 
     <item name ="voiceIcon">@drawable/ic_flag</item> 
     <item name="searchIcon">@drawable/ic_search</item> 
     <item name="queryBackground">@color/DarkYellow</item> 
     <item name="android:background">@color/MainYellow</item> 
     <item name="android:paddingBottom">20dp</item> 
     <item name="android:paddingTop">5dp</item> 
     <item name="android:paddingStart">-15dp</item> 
     <item name="android:paddingEnd">15dp</item> 
     <item name="android:inputType">textCapWords</item> 
    </style> 

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:voiceSearchMode="showVoiceSearchButton|launchRecognizer" 

    /> 

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.SearchView 
      android:id="@+id/top_search_bar" 
      style="@style/CustomSearchViewStyle" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/search_bar_height" 
      android:layout_alignParentStart="true" 
      app:iconifiedByDefault="false" 
      app:queryHint="@string/search_hint" 
      android:layout_alignParentEnd="true" /> 
    </RelativeLayout> 

Не удается получить причину, почему я не может помещать пользовательский значок закройте «Текст подсказки» или значок голосового поиска в конце панели, внутри поля запроса.

Я пытался использовать эту собственность: <item name="searchHintIcon">@drawable/ic_search</item> но ничего не происходит.

У вас есть предложения по этому поводу?

Большое вам спасибо.

Имейте славный день.

UPDATE: Кажется, что удаление строки «setIconifiedByDefault» в XML или в файле Java показывает подсказки Icon, но я хотел бы, чтобы мой SearchBar всегда НЕ свернуто (всегда видно) так, что не решает мой вопрос.

ответ

0

ОК, Кажется, мы решили решить эту проблему. (спасибо моему товарищу по команде Клаффоло)

Я честно не мог понять, как решить мою проблему, поэтому мы предпочли создать нашу личную панель поиска, вместо того, чтобы использовать Google.

Это результат, которого мы достигли: Search Bar (я заменил наш логотип этим домашним значком, потому что мы предпочитаем скрывать наш логотип.), Очень похожий на тот, который я хотел, мм?

Это мой activity_main.xml:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="?attr/colorPrimary" 
     android:layout_alignParentStart="true" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingTop="2dp" 
      android:paddingEnd="16dp"> 

      <ImageView 
       android:id="@+id/search_bar_hint_icon" 
       android:layout_width="32dp" 
       android:layout_height="32dp" 
       android:src="@drawable/ic_search"/> 

      <EditText 
       android:id="@+id/search_bar_edit_text" 
       android:layout_width="0dp" 
       android:hint="@string/search_hint" 
       android:textColorHint="@color/LightYellow" 
       android:backgroundTint="@color/DarkYellow" 
       android:background="@color/DarkYellow" 
       android:inputType="textCapWords" 
       android:layout_weight="1" 
       android:layout_height="32dp" /> 

      <ImageButton 
       android:id="@+id/search_bar_voice_icon" 
       android:layout_width="32dp" 
       android:layout_height="32dp" 
       android:background="@drawable/ic_mic" /> 

     </LinearLayout> 

    </android.support.v7.widget.Toolbar> 

    <ImageView 
     android:id="@+id/imageview_logo" 
     android:layout_width="match_parent" 
     android:layout_height="35dp" 
     android:layout_below="@id/my_toolbar" 
     android:src="@drawable/ic_home" 
     android:background="@color/MainYellow" 
     /> 
</RelativeLayout> 

Так как вы можете видеть, что это структура состоит из трех элементов: EditText, который обрабатывает входные данные, ImageView, которая представлена с помощью этого значка объектива перед текстовым полем поиска поиска и ImageButton, кнопка mic_icon, которая обрабатывает события voice_speech. Все они являются местами в linearLayout, а в панели Toolbar мне пришлось разместить поле layout_weight = 1 в EditText, чтобы достичь результата, который вы можете увидеть на картинке.

Во всяком случае, вот как мы обработаны наш код:

MainActivity.Java:

@Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //SETUP TOOLBAR 
     Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
     setSupportActionBar(myToolbar); 
} 
    voice_search_button = (ImageButton)findViewById(R.id.search_bar_voice_icon); 
    editText = (EditText) findViewById(R.id.search_bar_edit_text); 
    editText.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fragmentManager.beginTransaction().replace(R.id.fragment_container, new SearchResultsFragment()).commit(); 
     } 
    }); 

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(hasFocus){ 
       fragmentManager.beginTransaction().replace(R.id.fragment_container, new SearchResultsFragment()).commit(); 
      } 
     } 
    }); 

Для обработки voice_speech событий, добавьте следующие строки в MainActivity.java под OnCreate перекрытого метода:

//Voice Search Listener 
     voice_search_button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       promptSpeechInput(); 
      } 
     }); 

И переопределить эти два метода:

/** 
* Showing google speech input dialog 
* */ 
private void promptSpeechInput() { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
      getString(R.string.speech_prompt)); 
    try { 
     startActivityForResult(intent, REQ_CODE_SPEECH_INPUT); 
    } catch (ActivityNotFoundException a) { 
     Toast.makeText(getApplicationContext(), 
       getString(R.string.speech_not_supported), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

/** 
* Receiving speech input 
* */ 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
     case REQ_CODE_SPEECH_INPUT: { 
      if (resultCode == RESULT_OK && null != data) { 

       ArrayList<String> result = data 
         .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
       editText.setText(result.get(0)); 
       //TODO AVVIARE ATTIVITA' CON TESTO RESULT.GET(0) 
      } 
      break; 
     } 

    } 
} 

В конце концов, мы по-прежнему имеем дело с функциями instantSearch и фильтрации благодаря этому парню, который ответил здесь: How to filter a RecyclerView with a SearchView

Надеюсь, это помогло кому-то, в конце концов, я обновлю свой ответ.

Имейте славный день.