programing

프로그램 방식으로 SearchView를 열려면 어떻게 해야 합니까?

copyandpastes 2023. 2. 1. 22:18
반응형

프로그램 방식으로 SearchView를 열려면 어떻게 해야 합니까?

작업 표시줄에는 'SearchView'라는 위젯이 있습니다.사용하지 않을 때는 다음과 같이 표시됩니다.

여기에 이미지 설명 입력

사용중에는, 다음과 같이 표시됩니다.

여기에 이미지 설명 입력

(물론 프로그래밍 방식으로) 검색 보기를 엽니다('사용 중'으로 설정).

다음과 같은 몇 가지 기능을 시도했습니다.

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

하지만 그 중 어느 것도 효과가 없었다...

XML 내의 SearchView:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

를 전개합니다.SearchView와 함께

searchView.setIconified(false);

와 함께 쓰러뜨리고

searchView.setIconified(true);

값을 변경해야 합니다.android:showAsAction부터ifRoom|collapseActionView로.always.그SearchView의 속성android:iconifiedByDefault그래야 한다true디폴트값입니다.디폴트값이 아닌 경우 사용자는 이 값을 축소할 수 없습니다.SearchView프로그래밍 방식으로 확장되고 나서요.

전화 걸기expandActionView()메뉴 항목, ActionViewExpanded()가 아닌 ActionView의 onActionViewExpanded()가 아닙니다.

저는 좋아요.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

필요한 경우에만 지원 라이브러리를 사용하려면 다음과 같이 하십시오.

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

그렇지 않으면 간단히 이것을 해라.

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

늦은 건 알지만

expandActionView()를 호출하여 열고 collapseActionView()를 호출하여 닫습니다.getActionView()를 통해 실제 액션뷰에서 requestFocus()를 호출하여 검색뷰에 포커스를 부여할 수 있습니다.

위해서androidx.appcompat.widget.SearchView,

searchView.setIconifiedByDefault(true)   // didn't work

searchMenuItem.expandActionView()  // didn't work

MenuItemCompat.expandActionView(searchMenuItem) // didn't work

searchView.onActionViewExpanded()  // didn't work

다음은 나에게 효과가 있었다.

searchView.findViewById<View>(R.id.search_button).performClick()

마티아스 도굴꾼의 답변 확대:

검색값을 보관하고 사용자가 다른 fragment에서 돌아온 후 설정하기 위해 목록 fragment를 원했습니다.

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

그리고 내가 보관하고 있는 메뉴는always|collapseActionView그렇지 않으면 사용자가 텍스트를 삭제해도 열린 상태로 유지됩니다.

확장 상태를 복원해야 하므로 프로그래밍 방식으로 Search View를 확장하는 솔루션을 찾고 있었습니다.한 가지 해결책이 통하지 않았다.Handler().post()를 사용하는 경우는 제외합니다.post()를 사용하는 것이 좋지 않다는 것을 알고 있습니다.하지만 저는 레거시 프로젝트를 진행 중이고 이 회피책은 받아들일 수 있습니다.

변수 블록 초기화

val searchMenuItem = menu.findItem(R.id.menu_search_item)
val searchView = searchMenuItem.actionView as SearchView

Search View를 전개하는 방법

Handler().post {
   searchMenuItem.expandActionView()
}

post()가 도움이 되는 이유: 앱이 제대로 작성되지 않으면 UI 스레드에서 너무 많은 작업을 수행할 수 있습니다.post()는 UI 스레드를 실행할 수 있을 때 코드 블록이 실행되도록 합니다.즉, 이 회피책을 사용하는 경우 SearchView 확장 간에 약간의 지연이 발생할 수 있습니다.

를 열려면searchView유지close_button결국 이것을 에 사용하다onCreate:-

searchView.findViewById(R.id.search_button).performClick();

언급URL : https://stackoverflow.com/questions/14235677/how-do-i-open-the-searchview-programmatically

반응형