2015-01-06 24 views
8

Xin chào Tôi đang cố gắng triển khai SearchView giống như chúng tôi có trong Gmail.SearchView is null android

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

     searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 


     restoreActionBar(); 
     return true; 
    } 

    return super.onCreateOptionsMenu(menu); 
} 

đối tượng SearchView là null

Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dgp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="18" 
     android:targetSdkVersion="21" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/logo" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".GameSearchActivity" /> 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".GameInfoActivity" 
      android:label="@string/title_activity_game_info" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".MainActivity" /> 
     </activity> 
     <activity 
      android:name=".SettingsActivity" 
      android:label="@string/title_activity_settings" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".MainActivity" /> 
     </activity> 
     <activity 
      android:name=".GameSearchActivity" 
      android:label="@string/title_activity_game_search" > 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
      </intent-filter> 

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

</manifest> 

Searchable.xml

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

bố trí menu:

<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="com.example.dgp.MainActivity" > 

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

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:title="@string/action_settings" 
    app:showAsAction="never"/></menu> 

Có ai có thể giúp hiểu tại sao đối tượng này bị vô hiệu không? Cảm ơn bạn !!!!

+7

không nên là 'ứng dụng: actionViewClass'? Bạn đang mở rộng 'ActionBarActivity'? – Blackbelt

+0

YEAHH tuyệt vời bắt Blackbelt !!! cố định: D –

+0

bạn được chào đón – Blackbelt

Trả lời

29

Trong Menu Layout:

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

sử dụng này:

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

Vì vậy, bạn cần phải sử dụng app thay vì android trong thẻ mục menu:

app:actionViewClass="android.support.v7.widget.SearchView" 
+0

cảm ơn bạn! đó là vấn đề. –

+0

Chúc mừng, vui lòng trợ giúp :) – shyam

+1

Không hoạt động. Câu trả lời chưa hoàn chỉnh.Không có mã java. – StarWind0

-1

thử

MenuItem searchItem = menu.findItem(R.id.action_search); 
searchView = MenuItemCompat.getActionView(searchItem); 
+0

Tôi đã sử dụng: MenuMục tìm kiếmItem = menu.findItem (R.id.action_search); \t searchView = (SearchView) MenuItemCompat.getActionView (searchItem); Nhưng cùng một lỗi: 01-06 16: 51: 27.063: E/AndroidRuntime (27106): LOẠI TRỪ BẤT HỢP: chính 01-06 16: 51: 27.063: E/AndroidRuntime (27106): Process: com.dgp, PID: 27106 01-06 16: 51: 27.063: E/AndroidRuntime (27106): java.lang.NullPointerException: Cố gắng gọi phương thức ảo 'void android.support.v7.widget.SearchView.setSearchableInfo (android.app.SearchableInfo) 'về tham chiếu đối tượng null Cảm ơn bạn –

+0

bạn đã kiểm tra xem menuitem có rỗng không? Blackbelts bình luận cũng là chính xác, nó phải là ứng dụng: actionViewClass không android: actionViewClass – Shooky

0

Để ủng hộ quan điểm tìm kiếm bạn cần phải sử dụng

ứng dụng: actionViewClass = "android.support.v7.widget.SearchView" ---- trong xml đơn nộp

Và sẽ phải nhập khẩu

android.support.v7.widget.SearchView trong file java

hãy nhìn xe lớp được nhập một cách hợp lý là android.support.v7.widget.SearchView. khi hai phần này không giống nhau thì ngoại lệ con trỏ null có thể xảy ra.