20

현재 응용 프로그램은 왼쪽에 ListFragment, 오른쪽에는 DetailsFragment으로 설정되어 있습니다 (아래 태블릿 레이아웃과 유사). 작업 표시 줄에 Android Actionbar 검색 위젯 구현 ListFragment

layout

나는 검색어합니다 (ListFragment에) 목록의 내용을 업데이트해야합니다 제출 검색 위젯을 가지고있다. android dev ( http://developer.android.com/guide/topics/search/search-dialog.html)에 대한 검색 가이드를 따라 왔지만 동일한 활동으로 목록을 업데이트하는 데 문제가 있습니다.

검색 조건이 제출 될 때 새로운 활동을 호출하여 구현의 일부 양식을 얻을 수 있었지만 이로 인해 뒤로 버튼이 이상하게 작동합니다 (즉, 뒤로 누르고 검색 위젯으로 이전 활동으로 이동 함). 검색 용어 표시).

<intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
       android:resource="@xml/searchable"/> 

는 현재 활동의 목록을 업데이트 할 수있는 검색 위젯에 접근 가능을 다음과 같이

나는 매니페스트에 의도 라인을 추가?

답변

46

예, 실제로 "정상적인"사용 사례입니다. 기억해야 할 것은 검색 액션 바 위젯을 사용하는 단편은 위젯이 그 단편과 함께 파괴 될 것이므로 일반적으로 등록하는 부분이어야한다는 것입니다. 여기

입니다 제대로 묶어하는 방법 :

을에 ListFragment

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    .. 
    setHasOptionsMenu(true); 
    .. 
} 

다음 같은 ListFragment 내에서 오버라이드 (override)하여 옵션 메뉴를 만들 ... 당신이 옵션 메뉴 항목이 있음을 알 수 있도록 콜백, 일단 SearchView 위젯 참조가 있으면 QueryTextListener 콜백을 등록하십시오.

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.grid_default, menu); 
    SearchView searchView = (SearchView)menu.findItem(R.id.grid_default_search).getActionView(); 
    searchView.setOnQueryTextListener(queryListener); 
} 

earch 위젯 프로그래밍 (자바) 중 하나를 통해 또는 선언적으로 (XML) 여기 (위의 이름 grid_default.xml) XML이다 : 다시 지금

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item  
     android:id="@+id/grid_default_search" 
     android:icon="@android:drawable/ic_menu_search" 
     android:title="search" 
     android:showAsAction="always" 
     android:actionViewClass="android.widget.SearchView" 
    /> 

    <!-- other items or whatever --> 

</menu> 

당신의 ListFragment 당신은 우리가 위의 등록 된 queryListener을 만들어야합니다

private String grid_currentQuery = null; // holds the current query... 

final private OnQueryTextListener queryListener = new OnQueryTextListener() {  

    @Override 
    public boolean onQueryTextChange(String newText) { 
     if (TextUtils.isEmpty(newText)) { 
      getActivity().getActionBar().setSubtitle("List");    
      grid_currentQuery = null; 
     } else { 
      getActivity().getActionBar().setSubtitle("List - Searching for: " + newText); 
      grid_currentQuery = newText; 

     } 
     getLoaderManager().restartLoader(0, null, MyListFragment.this); 
     return false; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) {    
     Toast.makeText(getActivity(), "Searching for: " + query + "...", Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
}; 

이제는 쿼리가 변경되거나 제출 될 때를 알 수 있습니다. 예를 들어 데이터베이스가 작고 빠르기 때문에 키를 누를 때마다 다시 쿼리합니다.이 값을 변경해야 할 수도 있습니다. 위젯을 사용하여 ListFragment 내부의 개인 클래스 필드를 검색 대상의 현재 텍스트로 설정하는 방법에 유의하십시오. 채널 위젯 (grid_currentQuery) 내 onCreateLoader 내부에 난 그냥 이런 식으로 사용하는 쿼리를 업데이트하고 여기서 나는 그냥 getLoaderManager().restartLoader(0, null, MyListFragment.this);를 호출 오전 :

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle bargs) { 

    String sort = "SortColumn ASC"; 
    String[] grid_columns = new String[] { "ColumnA", "ColumnB", "Etc..." }; 
    String grid_whereClause = "ColumnToSearchBy LIKE ?" 

    if (!TextUtils.isEmpty(grid_currentQuery)) {    
     return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, grid_whereClause, new String[] { grid_currentQuery + "%" }, sort); 
    }  

    return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, null, null, sort); 
} 

을하고 당신이 정말로 필요가 전부는,이 다진의 종류 실현 하지만 어댑터를 설정하고 getLoaderManager().initLoader(0, null, this);을 사용하여 처음부터 로더를 시작하고 처리해야하는 나머지 로더 콜백의 나머지 부분이 있으므로 ...당신이 안드로이드 사람에 의해 앞으로 설정 한 모범 사례를 다음과 같은 경우하지만, (... 당신의 ListActivity들에 LoaderManager들 사용하고 ListFragments는 당신을 위해 아주 쉽게해야이야 난이 설명을 요청 해 주시기 도움이되기를 바랍니다

당신이해야 할 경우 의견에 -

+0

고맙다는 자세한 설명을 주셔서 감사합니다. 나는 며칠 이내에 그것을 구현하려고하고 어떤 문제가 있다면 알려주지. – bencallis

+0

감사 내가 그것을 관리했습니다 Logged 매우 유익한 답변을하고 있습니다. 내가 궁금해하는 한 가지입니다. 응용 프로그램에서 기본적으로 검색을 할 때 범주를 나타내는 3 개의 탭이 있습니다.이 탭을 제거하려면 문제가 없습니다. 문제는 내가 어떻게 알 수 있습니까? 사용자가 탭을 다시 추가하려면 검색을 마쳤습니다 (뒤로 이동). – bencallis

+0

@bencallis SearchView에 setOnCloseListener (SearchView.OnCloseListener listener)를 사용하고 싶다면 ... – ckozl