Programing

앱 호환성 이후 Searchview가 작동하지 않습니다.

lottogame 2020. 11. 29. 09:30
반응형

앱 호환성 이후 Searchview가 작동하지 않습니다.


내 검색보기가 더 이상 작동하지 않습니다.

 Process: com.laurenswuyts.witpa, PID: 26666
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference
            at com.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.java:75)
            at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
            at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275)
            at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
            at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
            at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49)
            at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459)
            at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

그래서 내가 가지고있는 동안 searchview에 대한 nullpointer :

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.event_main, menu);

        // Get the SearchView and set the searchable configuration
        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));


        return super.onCreateOptionsMenu(menu);
    }

그리고 내 메뉴에는 다음이 있습니다.

<!-- Search Widget -->
  <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/ic_action_search"
      app:showAsAction="always"
      android:actionViewClass="android.support.v7.widget.SearchView"/>

왜 더 이상 작동하지 않는지 모르겠지만 app compat 21을 사용하기 시작한 이후로 발생했습니다.

문안 인사,


사용자 정의 app네임 스페이스를 사용해보십시오 actionViewClass.

app:actionViewClass="android.support.v7.widget.SearchView"/>

폴더 안에있는 proguard-rules.pro 파일에 다음 줄을 추가 합니다.

-keep class android.support.v7.widget.SearchView {*; }


proguard를 활성화하고 SearchView클래스를 스트라이핑하는 경우에도 발생할 수 있습니다 . 클래스를 유지하려면 proguard 설정을 수정해야합니다.

자세한 내용은 질문을 참조하십시오.


Simas 답변에 대한 추가 정보입니다. 나는 이것을 다른 대답 ( https://stackoverflow.com/a/33400808/4949671 ) 에서 찾았으며 내 예외를 해결하는 데 매우 중요했습니다.

그렇지 app:actionViewClass 않습니다. android:actionViewClass


"실행 및 오류"를 재생 한 후 해결책을 찾았습니다. UI 요소가 오류의 원인이 아닌 것 같습니다. 검색을 QueryListener로 설정하면 잘 작동합니다. 다음은 몇 가지 코드입니다.

SearchBar를 포함하는 활동 :

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

        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                Log.d(TAG, "onQueryTextSubmit ");
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                Log.d(TAG, "onQueryTextChange ");
                return false;
            }
        });

        return true;
    }

searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
                                      android:label="@string/app_name"
                                      android:hint="@string/search_hint"/>

그리고 menu.xml 의 "SearchBar"

     <item
            android:id="@+id/search"
            android:title="@string/search_title"
            android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
            app:showAsAction="collapseActionView|ifRoom"
            app:actionViewClass="android.support.v7.widget.SearchView"/>

...

그리고 마지막으로, 매니페스트 (하지만 명확해야합니다) ...

  <activity
        android:name=".activities.MainActivity"
        android:label="@string/title_activity_main">
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>
    </activity>

추가 정보-> 문서


If you use progurd then you have to add the following line into proguard-rules.pro file

-keep public class android.support.v7.widget.** { *; }

or

-keep class android.support.v7.widget.SearchView { *; }


If if you minify in your build types like that then you need to add a single line your 'proguard-rules.pro' file.

buildTypes {
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

Add line your 'proguard-rules.pro' file.

-keep class android.support.v7.widget.SearchView { *; }

After you've clicked on a result, your app is expecting that an operation has not completed and is trying to go further into an Intent argument.

SearchView.OnSuggestionListener and return true which notifies your app that the click operation has completed.

        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {

            @Override
            public boolean onSuggestionClick(int position) {
                return true;
            }

            @Override
            public boolean onSuggestionSelect(int position) {
                return false;
            }
        });

Issue occurs if Proguard is enabled. can be fixed by adding this to proguard rules

-keep class android.support.v7.widget.SearchView { *; }

참고URL : https://stackoverflow.com/questions/27049294/searchview-doesnt-work-since-app-compat

반응형