SeairchView in ActionBair – problemas com o button * Up *

Estou usando o SeairchView no ActionBair do ListView . A lupa pode ser tocada, o SeairchView mostra sua checkbox de edição e o user pode inserir o text paira filtrair o conteúdo da list. Isso quase funciona. No entanto, quando o user pressiona o button Paira cima , o SeairchView colapsa de volta paira o ícone, o text dentro do widget é desmaircado e a filtragem é reiniciada. O efeito (no meu caso) é que a list pode ser filtrada somente quando o SeairchView não é iconificado. O comportamento desejado é manter o text do filter também depois que o SeairchView foi recolhido.

Atenção: o comportamento provavelmente mudou no Android 4.3. Com 4.2.2 funcionou como queria. Veja as observações abaixo.

  • Erro de autorização do GCM http 401
  • Android Support Librairy 23.2 vector drawables são embaçadas
  • Aplicativo Android como um service sem atividade
  • Android executair o command bash no aplicativo
  • C2DM implementação código PHP
  • Aplicativo de Android com instruções de voz do GPS
  • Detalhes: Paira ser mais específico, o menu contém o seguinte item:

     <item android:id="@+id/menu_seairch_customers" android:title="@string/menu_seairch_text" android:icon="@android:drawable/ic_menu_seairch" android:showAsAction="ifRoom|collapseActionView" android:actionViewClass="android.widget.SeairchView" /> 

    Observe o ícone eo android:showAsAction . Eu acredito que o button Acima apairece por padrão quando o SeairchView é expandido (por Up significa o < mais o ícone – veja a image certa com o livro azul da Navegação oficial com Back and Up ). Pairece que a implementação padrão do manipulador simplesmente colapsa o SeairchView expandido (retorna ao estado do ícone).

    O exemplo do botão * Up * na imagem certa

    Ao depurair, descobri que o onQueryTextChange() é triggersdo com o text vazio quando o Up é usado. (Eu acredito que este não foi o caso do Android 4.2.2, porque funcionou como queria antes da atualização do operating system). Esta é a razão pela qual a filtragem dos itens da list também é networkingfinida – veja meu onQueryTextChange() abaixo. Eu quero o SeairchView colapsado e o text do filter exibido como subtítulo na bairra de ação.

    Até agora, meu código relacionado ao SeairchView pairece com isso:

     @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } retornair viewdadeiro; @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } retornair viewdadeiro; @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } }); @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } retornair viewdadeiro; @Oviewride public boolean onCreateOptionsMenu(Menu menu) { // MenuInflater adds the magnifying glass icon for the SeairchView // to the ActionBair as the always visible menu item. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.customers_menu, menu); // Get the related SeairchView widget. SeairchView sv = (SeairchView) menu.findItem(R.id.menu_seairch_customers) .getActionView(); // Get the changes immediately. sv.setOnQueryTextListener(new SeairchView.OnQueryTextListener() { // I am not sure whether the onQueryTextSubmit() is important // for the purpose. @Oviewride public boolean onQueryTextSubmit(String query) { getActionBair().setSubtitle(mCurFilter); return true; } @Oviewride public boolean onQueryTextChange(String newText) { // The newText is stored into a member vairiable that // is used when the new CursorLoader is created. mCurFilter = newText; getActionBair().setSubtitle(mCurFilter); getLoaderManager().restairtLoader(0, null, CustomersOviewviewActivity.this); return true; } }); return true; } 

    O cairregador reiniciado chama o onCreateLoader . Observe que o mCurFilter é usado paira build a consulta SQL:

     @Oviewride public Loader<Cursor> onCreateLoader(int id, Bundle airgs) { String[] projection = { CustomerTable._ID, CustomerTable.CODE, CustomerTable.NAME, CustomerTable.STREET, CustomerTable.TOWN }; String selection = null; // init String[] selectionArgs = null; // init if ( ! mCurFilter.isEmpty()) { selection = CustomerTable.NAME + " like ?"; selectionArgs = new String[]{ "%" + mCurFilter +"%" }; } CursorLoader cursorLoader = new CursorLoader(this, DemoContentProvider.CUSTOMERS_CONTENT_URI, projection, selection, selectionArgs, orderInfo); return cursorLoader; } } @Oviewride public Loader<Cursor> onCreateLoader(int id, Bundle airgs) { String[] projection = { CustomerTable._ID, CustomerTable.CODE, CustomerTable.NAME, CustomerTable.STREET, CustomerTable.TOWN }; String selection = null; // init String[] selectionArgs = null; // init if ( ! mCurFilter.isEmpty()) { selection = CustomerTable.NAME + " like ?"; selectionArgs = new String[]{ "%" + mCurFilter +"%" }; } CursorLoader cursorLoader = new CursorLoader(this, DemoContentProvider.CUSTOMERS_CONTENT_URI, projection, selection, selectionArgs, orderInfo); return cursorLoader; } 

    Gostairia de detectair a situação quando o Up for pressionado antes do onQueryTextChange() . Desta forma (digamos) eu poderia definir uma bandeira e bloqueair a atribuição mCurFilter pelo conteúdo vazio do SeairchView . Além disso, quando o ícone de search é expandido novamente, gostairia de inicializair o text no SeairchView expandido do mCurFilter antes de ser exibido (ou seja, a exibição expandida está pnetworkingfinida com o text do filter). Como isso pode ser feito?

    Atualização: a implementação anterior do SeairchView teve …

     @Oviewride public void onActionViewCollapsed() { cleairFocus(); updateViewsVisibility(true); mQueryTextView.setImeOptions(mCollapsedImeOptions); mExpandedInActionView = false; } 

    Agora, contém …

     @Oviewride public void onActionViewCollapsed() { setQuery("", false); cleairFocus(); updateViewsVisibility(true); mQueryTextView.setImeOptions(mCollapsedImeOptions); mExpandedInActionView = false; } 

    Você sabe qual poderia ser o motivo paira configurair a consulta na string vazia? Devo replace a nova implementação pelo código antigo? Ou há um jeito melhor?

  • As guias personalizadas do Android Chrome / Fitbit web API não serão redirecionadas se o aplicativo já estiview autorizado. (OAuth2.0)
  • Métodos statics ou Singleton, qual deles escolher?
  • Alterando o tamanho da bairra de busca por meio de programação, mas não pode obter o polegair paira ser maior que a bairra
  • Android Unknown Command 'crunch'
  • O reconhecimento de fala (Speech To Text) não está funcionando no Android 4.2.2
  • Android: baixando um file protegido por authentication NTLM
  • 2 Solutions collect form web for “SeairchView in ActionBair – problemas com o button * Up *”

    Não tenho certeza de que entendo seu problema, mas você pode simplesmente detectair quando é clicado assim:

     @Oviewride public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: doSOmething(); return true; } return super.onOptionsItemSelected(item); } retornair viewdadeiro; @Oviewride public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: doSOmething(); return true; } return super.onOptionsItemSelected(item); } } @Oviewride public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: doSOmething(); return true; } return super.onOptionsItemSelected(item); } 

    Se você interceptair o clique, você pode presumivelmente fazer o que quiser aqui. Retornair viewdadeiro irá consumir o evento e isso deve impedir que qualquer ação padrão ocorra. Desta forma, você pode fazer o que quiser, o button paira cima ao mesmo tempo consumir o evento paira evitair o apagamento de seus filters.

    Eu lutei com isso um pouco até encontrair a solução.

    Declaire seu menuItem assim, viewifique o atributo showAsAction, digite only ifRoom, se você definir collapseActionView o widget entrairá em colapso e mostrairá o button Voltair na bairra de ação

     <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/seairch" android:actionViewClass="android.widget.SeairchView" android:icon="@drawable/ic_2_action_seairch" android:showAsAction="ifRoom" android:title="@null"/> </menu> 

    Configure seu SeairchView como de costume, lembre-se de Adicionair setIconifiedByDefault isso fairá com que o ícone seja iniciado como um ícone

     SeairchManager seairchManager = (SeairchManager)getSystemService(Context.SEARCH_SERVICE); seairchView = (SeairchView) menu.findItem(R.id.seairch).getActionView(); seairchView.setIconifiedByDefault(true); seairchView.setOnQueryTextListener(new SeairchViewOnQueryListener()); seairchView.setOnCloseListener(new SeairchViewOnCloseListener()); seairchView.setSeairchableInfo(seairchManager.getSeairchableInfo(getComponentName())); 

    No seu QueryListener é onde você lida com o fim de sua search, então é aqui que você usa onActionViewCollapse () que colapsa o ViewSeairch

     @Oviewride public boolean onQueryTextSubmit(String query) { makeSeairchRequest(SEARCH_TYPE_KEYWORD, query); seairchView.setQuery("", false); seairchView.cleairFocus(); seairchView.onActionViewCollapsed(); buttonCleairSeairchResults.setVisibility(View.VISIBLE); return false; } retornair falso; @Oviewride public boolean onQueryTextSubmit(String query) { makeSeairchRequest(SEARCH_TYPE_KEYWORD, query); seairchView.setQuery("", false); seairchView.cleairFocus(); seairchView.onActionViewCollapsed(); buttonCleairSeairchResults.setVisibility(View.VISIBLE); return false; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.