[Android] 검색 화면을 SearchView로 설치

17288 단어 AndroidJava

1. 시작


Qittaro라는 앱을 만들 때는 검색 화면을 설치해야 한다.
일반적인 검색 단어를 입력하고 결과를 표시하는 프로세스 응용 프로그램입니다.
애초 Fragment에 가입EditText하고 setOnEditorActionListener()에서 Enter를 누르면...이런 절차 처리.
이런 느낌이야.
EditText editText = (EditText)this.findViewById(R.id.edit_text);
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            // ここに処理
        }
    }
});
이런 놈.
하지만 검색 단어 입력이 검색 결과 일람과 함께 이상해 보인다면 트위터 앱에서 액션 바가 있는 곳에 검색 단어를 입력할 수 있다는 걸 발견하고 검색해 봤다.
그리고 순조롭게 이루어졌습니다. 이 설치를 소개하고 싶습니다.

2. SearchView 설치


안드로이드를 찾았습니다.widget.SearchView라고 합니다.
SearchView | Android Developers
특별히 어려운 일이 없으니 실장부터 입력단어까지 발췌문을 소개한다.

2.1. SupportLibrary


갑작스럽지만android.widget.SearchViewAPI Level 11 이상이다.
Qittaro는 안드로이드 버젼 2.3 이상을 대상으로 하기 때문에 이렇게 사용하면 안 되지만 SupportLibrary가 있어서 그걸 썼어요.
그러나 설치에 큰 변화가 없기 때문에 어느 것이든 간단하게 가져올 수 있다.

2.2. 소스 코드


따라서 원본 코드를 보십시오.
SearchFragment.java
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.Menu;
import android.view.ViewGroup;


public class SearchFragment extends Fragment {

    private static final String TAG = SearchFragment.class.getSimpleName();
    private final SearchFragment self = this;

    private SearchView searchView;
    private String searchWord;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // FragmentでMenuを表示する為に必要
        this.setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_search, container, false);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        // Menuの設定
        inflater.inflate(R.menu.search, menu);

        // app:actionViewClass="android.support.v7.widget.SearchView"のItemの取得
        MenuItem menuItem = menu.findItem(R.id.search_menu_search_view);

        /**
         * API level 11以上の場合はこっちを使う
         * 
         * this.searchView = (SearchView)menuItem.getActionView();
         */

        // ActionViewの取得
        this.searchView = (SearchView) MenuItemCompat.getActionView(menuItem);

        // 虫眼鏡アイコンを最初表示するかの設定
        this.searchView.setIconifiedByDefault(true);

        // Submitボタンを表示するかどうか
        this.searchView.setSubmitButtonEnabled(false);


        if (!this.searchWord.equals("")) {
            // TextView.setTextみたいなもの
            this.searchView.setQuery(this.searchWord, false);
        } else {
            String queryHint = self.getResources().getString(R.string.search_menu_query_hint_text);
            // placeholderみたいなもの
            this.searchView.setQueryHint(queryHint);
        }
        this.searchView.setOnQueryTextListener(self.onQueryTextListener);
    }

    private SearchView.OnQueryTextListener onQueryTextListener = new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String searchWord) {
            // SubmitボタンorEnterKeyを押されたら呼び出されるメソッド
            return self.setSearchWord(searchWord);
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            // 入力される度に呼び出される
            return false;
        }
    };

    private boolean setSearchWord(String searchWord) {
        ActionBar actionBar = ((ActionBarActivity)this.getActivity()).getSupportActionBar();
        actionBar.setTitle(searchWord);
        actionBar.setDisplayShowTitleEnabled(true);
        if (searchWord != null && !searchWord.equals("")) {
            // searchWordがあることを確認
            this.searchWord = searchWord;
        }
        // 虫眼鏡アイコンを隠す
        this.searchView.setIconified(false);
        // SearchViewを隠す
        this.searchView.onActionViewCollapsed();
        // Focusを外す
        this.searchView.clearFocus();
        return false;
    }
}
search.xml
<!-- res/menu/search.xml -->
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <item
        android:id="@+id/search_menu_search_view"
        android:orderInCategory="100"
        android:title="@string/search_menu_search_text"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"
        />

</menu>

2.3. 캡처


이렇게 된 느낌.
핸드폰 상황

태블릿의 경우

2.4. 주의점


특별히 맞춤형으로 제작되지 않았기 때문에 가장 작게 설치했습니다.
이번에는 Fragment에서 검색어를 얻고 싶어서 Fragment에서 실시Menu했습니다.Activity 별다른 일을 하지 않았다.
단어에 유사 검색 옵션을 붙이면 힘들어요.
이럴 때는 솔직하게 EditText+Button 이런 설치를 하는 게 좋을 것 같아요.

3. 끝


이거 볼 때 정말 즐거웠어요.
나는 SDK가 나를 위해 이런 물건을 준비했다고 생각한다...
쓸 수 있는 건 이런 정신으로 하는 게 좋을 것 같아서요.
이 설치된 검색 화면을 사용하세요.

좋은 웹페이지 즐겨찾기