예, 실제로 "정상적인"사용 사례입니다. 기억해야 할 것은 검색 액션 바 위젯을 사용하는 단편은 위젯이 그 단편과 함께 파괴 될 것이므로 일반적으로 등록하는 부분이어야한다는 것입니다. 여기
입니다 제대로 묶어하는 방법 :
을에 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
는 당신을 위해 아주 쉽게해야이야 난이 설명을 요청 해 주시기 도움이되기를 바랍니다
당신이해야 할 경우 의견에 -
고맙다는 자세한 설명을 주셔서 감사합니다. 나는 며칠 이내에 그것을 구현하려고하고 어떤 문제가 있다면 알려주지. – bencallis
감사 내가 그것을 관리했습니다 Logged 매우 유익한 답변을하고 있습니다. 내가 궁금해하는 한 가지입니다. 응용 프로그램에서 기본적으로 검색을 할 때 범주를 나타내는 3 개의 탭이 있습니다.이 탭을 제거하려면 문제가 없습니다. 문제는 내가 어떻게 알 수 있습니까? 사용자가 탭을 다시 추가하려면 검색을 마쳤습니다 (뒤로 이동). – bencallis
@bencallis SearchView에 setOnCloseListener (SearchView.OnCloseListener listener)를 사용하고 싶다면 ... – ckozl