2015-03-16 5 views
3

Я прошел учебник по интерфейсу поиска на сайте разработчиков Android и успешно реализован.Как изменить фон панели действий при нажатии кнопки «Поиск»?

Единственное, чего я не смог достичь, это изменить фон Actionbar при нажатии на меню поиска и вернуть его обратно при нажатии кнопки «Назад»?

Ниже приведен скриншот из приложения Gmail. Обычная панель действий выглядит так.

enter image description here

И при нажатии на меню поиска он изменяется на один, как показано ниже, не изменяя активности.

enter image description here

Я хочу, чтобы достичь этой функциональности. Пожалуйста помоги. Благодарю.

+1

Вы попробовали мое решение? –

+0

Да, я сделал это сейчас. Оно работает! –

ответ

5

В основном FrameLayout создается в приложении Gmail, который содержит два вида:

  • Toolbar - первая красная панель инструментов, которая доступна в публичных API
  • MaterialSearchActionView, который содержит три вида
    • ImageView - с задней стрелка
    • EditText
    • ImageView - с "х"/"микрофон"

Второй вид не доступен в публичном API.

Я думаю, что идея проста. Когда вы открываете свой Activity, второй вид - GONE, а при нажатии Значок поиска показано. Невозможно получить MaterialSearchActionView, поэтому вам нужно создать свой собственный вид, содержащий эти элементы управления.

создать небольшой пример того, как сделать это:

DoubleActionBarActivity.class:

public class DoubleActionBarActivity extends ActionBarActivity { 

    Toolbar toolbar; 
    Toolbar searchToolbar; 
    boolean isSearch; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_with_double_toolbar); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     searchToolbar = (Toolbar) findViewById(R.id.toolbar_search); 
     prepareActionBar(toolbar); 
    } 

    private void prepareActionBar(Toolbar toolbar) { 
     setSupportActionBar(toolbar); 
     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     if (Build.VERSION.SDK_INT >= 21) { 
      getWindow().setStatusBarColor(getResources().getColor(isSearch ? android.R.color.darker_gray : android.R.color.holo_red_dark)); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(isSearch ? R.menu.search_for_second_toolbar : R.menu.search_item_only, menu); 
     if (isSearch) { 
      final SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

      search.setIconified(false); 
      search.setQueryHint("search"); 
      search.setOnCloseListener(new SearchView.OnCloseListener() { 
       @Override 
       public boolean onClose() { 
        return true; 
       } 
      }); 
     } 
     return super.onCreateOptionsMenu(menu); 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     switch (id){ 
      case R.id.action_search:{ 
       isSearch = true; 
       searchToolbar.setVisibility(View.VISIBLE); 
       prepareActionBar(searchToolbar); 
       supportInvalidateOptionsMenu(); 
       return true; 
      } 
      case android.R.id.home: 
       if(isSearch){ 
        isSearch = false; 
        prepareActionBar(toolbar); 
        searchToolbar.setVisibility(View.GONE); 
        supportInvalidateOptionsMenu(); 
       } 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

activity_with_double_toolbar.xml

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

    <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/abc_action_bar_default_height_material"> 
     <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:background="@android:color/holo_red_dark" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

     </android.support.v7.widget.Toolbar> 
     <android.support.v7.widget.Toolbar 
       android:visibility="gone" 
       android:background="@android:color/darker_gray" 
       android:gravity="center_vertical" 
       android:id="@+id/toolbar_search" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
     </android.support.v7.widget.Toolbar> 
    </FrameLayout> 

</LinearLayout> 

search_for_second_toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
      android:id="@+id/action_search" 
      app:showAsAction="ifRoom" 
      app:actionViewClass="android.support.v7.widget.SearchView" 
      android:title="Search"/> 
</menu> 

search_item_only.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_search" 
      android:title="search" 
      android:icon="@drawable/abc_ic_search_api_mtrl_alpha" 
      app:showAsAction="ifRoom" ></item> 
</menu> 

Кроме того, вы можете посмотреть на эту библиотеку

https://github.com/Quinny898/PersistentSearch

Это может быть интересно для вас.

+0

Привет Конрад, он решает проблему большое время. Спасибо за ваше время, зарываясь в API. –

+0

Также спасибо за эту ссылку. Нужна она в другом приложении! –

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