툴바 Android에서 SearchView를 사용하는 방법


124

내가 작업하는 코드는 a를 사용 Toolbar하고 menu.

다음은 코드입니다.

private Toolbar mToolbar;
mToolbar.inflateMenu(R.menu.chat_screen_menu);
setupMenu ();
private void setupMenu ()
   {
   mMenu = mToolbar.getMenu();
   if (mMenu != null)
      {
       if (mChatPager != null && mChatPager.getCurrentItem() > 0)
          {
          mMenu.setGroupVisible(R.id.menu_group_chats, true);
          mMenu.setGroupVisible(R.id.menu_group_contacts, false);
          }
       else
          {
           mMenu.setGroupVisible(R.id.menu_group_chats, false);
           mMenu.setGroupVisible(R.id.menu_group_contacts, true);
           mMenu.setGroupVisible(R.id.menu_group_otr_verified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_off,false);
          }
    }
    mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener ()
    {
    ..........
    }
}

그러나 지금, 그들은 필요 Search에서 버튼을 tool_bar. 나는 그것을 넣을 수 있었고, 나는 여기 에 가이드를 따랐다. 내가 검색 할 것을 쓰려고 할 때, 내가 listener보여주지 않은 것을 테스트하기 위해 두었던 토스트 . listener작동하지 않음 을 나타내는

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.chat_screen_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search));
    final Toast toast = new Toast(mApp);

    if (mSearchView != null )
    {
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
        {
            public boolean onQueryTextChange(String newText)
            {
                mSearchString = newText;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                mSearchString = query;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();

                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);
    }

    return true;

}

답변:


205

이를 위해 Appcompat라이브러리 를 사용해야 합니다. 아래와 같이 사용됩니다.

dashboard.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        android:title="Search"/>
</menu>

활동 파일 (자바) :

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.dashboard, menu);

     MenuItem searchItem = menu.findItem(R.id.action_search);

    SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);

    SearchView searchView = null;
    if (searchItem != null) {
        searchView = (SearchView) searchItem.getActionView();
    }
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
    }
        return super.onCreateOptionsMenu(menu);
}

활동 파일 (Kotlin) :

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_search, menu)

    val searchItem: MenuItem? = menu?.findItem(R.id.action_search)
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView: SearchView? = searchItem?.actionView as SearchView

    searchView?.setSearchableInfo(searchManager.getSearchableInfo(componentName))
    return super.onCreateOptionsMenu(menu)
}

매니페스트 파일 :

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.apkgetter.SearchResultsActivity" /> 

        <activity
            android:name="com.apkgetter.SearchResultsActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

검색 가능한 xml 파일 :

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_name" />

마지막으로 SearchResultsActivity수업 코드입니다. 검색 결과를 표시합니다.


18
이제해야합니다import android.support.v7.widget.SearchView
Joaquin Iurchuk

감사합니다. "이동"클릭을 처리하는 방법에 대한 아이디어가 있습니까? 그것은 도움이 될 것이다
발라 비슈누에게


2
android : actionViewClass 대신 app : actionViewClass를 참고하세요.
DragonT

1
androidX로 마이그레이션 한 경우 다음을 사용하십시오.androidx.appcompat.widget.SearchView
Daniil

169

에서 검색 기능을 설정하려면 Fragment다음 몇 줄을 추가하십시오.

1 단계 -검색 필드 추가 toolbar:

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="Search"/>

2 단계 -논리 추가onCreateOptionsMenu()

import android.support.v7.widget.SearchView; // not the default !

@Override
public boolean onCreateOptionsMenu( Menu menu) {
    getMenuInflater().inflate( R.menu.main, menu);

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // Toast like print
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}

29
이 답변은 사용자가 검색 쿼리를 제출했을 때 새 활동을 생성 / 이동하지 않으려는 경우 훨씬 더 유용합니다. 이렇게하면 동일한 활동 / 조각에 머무르고 사용자 입력에 따라보기를 업데이트 할 수 있습니다. 훌륭한 물건.
Nick.D

3
UserFeedback ...은 내 Toast 유사 방법입니다.
tm1701

키보드 입력 검색보기에서 촬영하지
Saravanan

무엇입니까 R.menu.main?
Alston

public void onCreateOptionsMenu (@NonNull Menu menu, @NonNull MenuInflater inflater) {} 여기에서이 메서드를 직접 호출하여 자체 메뉴에 침투 할 수 있으며 액티비티를 사용하지 않고 프래그먼트에서 직접 처리 할 수 ​​있습니다. 감사합니다
Amar Singh

40

도구 모음에 직접 추가하려는 경우.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <SearchView
            android:id="@+id/searchView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:iconifiedByDefault="false"
            android:queryHint="Search"
            android:layout_centerHorizontal="true" />

    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>


2
지원 SearchView를 사용하는 android.support.v7.widget.SearchView경우 XML에서도 선언하는 것을 잊지 마십시오 .
버려진 장바구니

Gradle을에 추가하는 것을 잊지 마세요implementation 'com.android.support:design:$latest_version'
알리

아이콘 화란 무엇입니까 ?
IgorGanapolsky

¨ 검색 필드가 항상 표시되도록하려면 문서에서 setIconifiedByDefault (false)를 호출하십시오.
noe

16

SearchView와 RecyclerView 통합

1) 메뉴에 SearchView 항목 추가

SearchViewactionView메뉴에서 와 같이 추가 할 수 있습니다.

app : useActionClass = "android.support.v7.widget.SearchView".

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="rohksin.com.searchviewdemo.MainActivity">
<item
    android:id="@+id/searchBar"
    app:showAsAction="always"
    app:actionViewClass="android.support.v7.widget.SearchView"
    />
</menu>

2) 활동에 SearchView.OnQueryTextListener 구현

SearchView.OnQueryTextListener두 가지 추상 방법이 있습니다. 따라서 활동 스켈레톤은 이제 SearchView 텍스트 리스너를 구현 한 후 다음과 같이 보입니다.

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) SerchView Hint 텍스트, 리스너 등 설정

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    MenuItem searchItem = menu.findItem(R.id.searchBar);

    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setQueryHint("Search People");
    searchView.setOnQueryTextListener(this);
    searchView.setIconified(false);

    return true;
}

4) SearchView.OnQueryTextListener 구현

이것이 리스너의 추상 메소드를 구현하는 방법입니다.

@Override
public boolean onQueryTextSubmit(String query) {

    // This method can be used when a query is submitted eg. creating search history using SQLite DB

    Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onQueryTextChange(String newText) {

    adapter.filter(newText);
    return true;
}

5) RecyclerView 어댑터에 필터 메서드를 작성합니다.

요구 사항에 따라 고유 한 논리를 만들 수 있습니다. 다음은에 입력 된 텍스트가 포함 된 이름 목록을 보여주는 샘플 코드 스 니펫 SearchView입니다.

public void filter(String queryText)
{
    list.clear();

    if(queryText.isEmpty())
    {
        list.addAll(copyList);
    }
    else
    {

        for(String name: copyList)
        {
            if(name.toLowerCase().contains(queryText.toLowerCase()))
            {
                list.add(name);
            }
        }

    }

    notifyDataSetChanged();
}

전체 작업 코드 예제> 찾을 수 있습니다 여기에
당신은이에 SQLite는 데이터베이스와 SearchView의 코드를 확인하실 수 있습니다 음악 앱


메뉴가 필요한 이유는 무엇입니까?
IgorGanapolsky

1

menu.xml파일을 사용하지 않고 SearchView를 구현하고 버튼을 통해 열기

당신에 Activity우리의 방법을 사용할 필요가 onCreateOptionsMenu있는 우리가 프로그래밍을 팽창 할 방법을SearchView

private MenuItem searchMenu;
private String mSearchString="";

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        SearchManager searchManager = (SearchManager) StoreActivity.this.getSystemService(Context.SEARCH_SERVICE);


        SearchView mSearchView = new SearchView(getSupportActionBar().getThemedContext());
        mSearchView.setQueryHint(getString(R.string.prompt_search)); /// YOUR HINT MESSAGE
        mSearchView.setMaxWidth(Integer.MAX_VALUE);

        searchMenu = menu.add("searchMenu").setVisible(false).setActionView(mSearchView);
        searchMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);


        assert searchManager != null;
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                mSearchString = newText;

                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                mSearchString = query;

                searchMenu.collapseActionView();


                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);


        return true;
    }

그리고 Activity 클래스에서 SearchView아래와 같이 툴바에서 아무 버튼이나 클릭하여 열 수 있습니다.

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.