studio example custom bar android android-actionbar appcompat android-search

example - android studio toolbar menu



Android appcompat API 10 vista de acción de colapso (1)

Actualmente estoy desarrollando una aplicación de Android que necesita compatibilidad con Api10 +. Seguí muchos tutoriales para configurar appcompat y gestionar la creación de la barra de acciones.

enlaces como: https://stackoverflow.com/a/21291156/2789106 http://developer.android.com/guide/topics/ui/actionbar.html

Solo hay tres cosas que no puedo hacer.

  1. Cuando se abre la búsqueda, la lupa de búsqueda NO cambia al conjunto I dibujable.
  2. No puedo cambiar el ícono "Atrás" (el botón "Inicio arriba", a la izquierda del logotipo (es una imagen diferente a la que pasé en la creación del drawerToggle ))
  3. No puedo cerrar (colapsar) por programación la vista de acción cuando se hace clic en la Búsqueda de teclado. (llamando a collapseActionView() se implementó en la API 14)

Aquí está mi código:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ActionBarDrawerToggle ties together the the proper interactions // between the sliding drawer and the action bar app icon mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); // Restore app state if any if (savedInstanceState == null) { mLeftMenuContainer = (LinearLayout) findViewById(R.id.left_menu_container); mLeftMenuContainer.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { // return TRUE to avoid tap on back view return true; } }); mDrawerLayout.closeDrawer(mLeftMenuContainer); } // enable ActionBar app icon to behave as action to toggle nav drawer getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(true); getSupportActionBar().setLogo(R.drawable.ic_action_bar_logo); } /* Called whenever we call supportInvalidateOptionsMenu() */ @Override public boolean onPrepareOptionsMenu(Menu menu) { // If the nav drawer is open, hide action items related to the content // view if (mDrawerLayout != null && mLeftMenuContainer != null) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(mLeftMenuContainer); for (int i = 0; i < menu.size(); i++) { menu.getItem(i).setVisible(!drawerOpen); } } return super.onPrepareOptionsMenu(menu); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { mMenu = menu; // Inflate the menu; this adds items to the action bar if it is present. // enable ActionBar app icon to behave as action to toggle nav drawer getMenuInflater().inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.action_bar_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); searchView.setSearchableInfo(info); AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); searchText.setHintTextColor(getResources().getColor(R.color.color_action_bar_search_text)); searchText.setTextColor(getResources().getColor(R.color.color_action_bar_search_text)); searchView.setIconifiedByDefault(true); // Getting the ''search_plate'' LinearLayout. View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); // Setting background of ''search_plate'' to personal defined drawable. if (searchPlate != null) { searchPlate .setBackgroundResource(R.drawable.texfield_search_view_theme); } // Set search view clear icon ImageView searchIconClearView = (ImageView) searchView .findViewById(android.support.v7.appcompat.R.id.search_close_btn); if (searchIconClearView != null) { Log.v(LOG_TAG, "Should Change Clear Icon here"); searchIconClearView .setImageResource(R.drawable.ic_action_bar_clear_search); } // Set search view Magnifier icon ImageView searchIcon = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon); if (searchIcon != null) { Log.v(LOG_TAG, "Should Change Search Icon here"); searchIcon.setImageResource(R.drawable.ic_action_bar_back); } // Set on click to open a fragment, not a activity final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { // Do something return true; } @Override public boolean onQueryTextSubmit(String query) { Log.v(LOG_TAG, "Performed search with: " + query); searchView.clearFocus(); return true; } }; searchView.setOnQueryTextListener(queryTextListener); MenuItemCompat.setOnActionExpandListener(searchItem, new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem arg0) { mMenu.findItem(R.id.action_bar_cart).setVisible(true); return true; } @Override public boolean onMenuItemActionExpand(MenuItem arg0) { getSupportActionBar().setIcon(R.drawable.ic_action_bar_logo); mMenu.findItem(R.id.action_bar_cart).setVisible(false); return true; } }); return super.onCreateOptionsMenu(menu); }

¿Puede alguien decirme por favor si estoy haciendo algo mal?

- EDITAR -

Logré solucionar las preguntas número 1 y 2:

Lo que debe hacer es definir homeUpIcon en su Tema. Entonces, si está soportando API 10 como yo:

<style name="Theme.MyTheme" parent="@style/Theme.AppCompat.Light"> <item name="searchViewSearchIcon">@drawable/your_search_icon</item> <!-- API 13- Support --> <item name="homeAsUpIndicator">@drawable/your_back_icon</item> <!-- API 14+ --> <item name="android:homeAsUpIndicator">@drawable/your_back_icon</item> </style>

encontrado en
ActionBarSherlock: cambiar homeAsUpIndicator no funciona
y Cambiar el fondo dibujable del widget searchview

La pregunta más importante aún está pendiente y si alguien sabe la respuesta, ¡por favor publique aquí!


Prueba esto:

public boolean onQueryTextSubmit(String query) { MenuItemCompat.collapseActionView(searchItem); return false; }