4

Я использую ActionBarActivity, Как поддерживать searchItem.setOnActionExpandListener в API уровне 8+? В нем говорится, что для этого требуется минимальный уровень API 14.Как поддерживать searchItem.setOnActionExpandListener в API уровне 8+?

Ниже мой код. В настоящее время я подавляю ошибку и разрешаю выполнение кода, только если API> = 14.

@SuppressLint("NewApi") 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.action_bar_home_screen, menu); 
    searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat 
       .getActionView(searchItem); 

     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      searchItem.setOnActionExpandListener(new OnActionExpandListener() { 

       @Override 
       public boolean onMenuItemActionExpand(MenuItem item) { 
        hideProgressBar(); 
        return true; 
       } 

       @Override 
       public boolean onMenuItemActionCollapse(MenuItem item) { 
        showProgressBar(); 
        selectItem(lastSelectedItemPosition); 
        return true; 
       } 
      }); 
     } 
} 
+0

Я ответил на вопрос здесь: http://stackoverflow.com/a/28762632/1633609 –

ответ

0

Вы не можете это сделать, сам интерфейс MenuItem.OnActionExpandListener доступен с уровня 14 API тоже. Если ваш вопрос связан с поиском: http://developer.android.com/guide/topics/search/search-dialog.html

+0

Я просто хочу знать, когда разворачивается поиск и когда он рухнет. – yajnesh

+0

Как я вижу в документах, вся информация о расширении была введена с уровнем API 14 – viplezer

+0

Я искал, что ответил ianhanniballake. Спасибо, в любом случае. – yajnesh

1

Вы можете добавить ViewTreeObserver, чтобы отслеживать видимость android.support.v7.appcompat.R.id.search_edit_frame. Вы можете проверить мой ответ здесь: https://stackoverflow.com/a/28762632/1633609

Это копия моего решения от другого вопроса:

я обнаружил, что MenuItemCompat.setOnActionExpandListener(...) не работает, если вы не сдадите:

searchItem 
      .setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 
        | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); 

Но это меняет SearchView и заменяет DrawerToggle на стрелку назад.

Я хотел сохранить исходные представления и отслеживать состояние расширенного/сложенного состояния и использовать поддерживаемый вид поиска.

Решение:

Когда android.support.v7.widget.SearchView изменяет состояние представления вид LinearLayout годов, с идентификатором android.support.v7.appcompat.R.id.search_edit_frame, значение видимости изменяется от View.VISIBLE до View.GONE и напротив. Поэтому я добавляю ViewTreeObserver для отслеживания изменения видимости рамки редактирования поиска.

menu_search.xml:

<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:icon="@android:drawable/ic_menu_search" 
    android:title="@string/search" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="always"/> 

</menu> 

В деятельности:

import android.support.v4.view.MenuItemCompat; 
import android.support.v7.widget.SearchView; 
import android.view.Menu; 
import android.view.MenuItem; 

.......... 

private View mSearchEditFrame; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_search, menu); 
    MenuItem searchItem = (MenuItem) menu.findItem(R.id.action_search); 

    SearchView searchView = (SearchView) MenuItemCompat 
      .getActionView(searchItem); 
    searchView.setSubmitButtonEnabled(false); 
    mSearchEditFrame = searchView 
      .findViewById(android.support.v7.appcompat.R.id.search_edit_frame); 

    ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     int oldVisibility = -1; 

     @Override 
     public void onGlobalLayout() { 

      int currentVisibility = mSearchEditFrame.getVisibility(); 

      if (currentVisibility != oldVisibility) { 
       if (currentVisibility == View.VISIBLE) { 
        Log.v(TAG, "EXPANDED"); 
       } else { 
        Log.v(TAG, "COLLAPSED"); 
       } 

       oldVisibility = currentVisibility; 
      } 

     } 
    }); 

    return super.onCreateOptionsMenu(menu); 
}