2013-10-11 18 views
10

Tôi đang cố gắng làm cho ứng dụng của mình bao gồm hoạt động SINGLE. Hoạt động này có thể tạo tìm kiếm và cũng nhận được tìm kiếm. Thật không may, tôi đang nhận được thanh tìm kiếm "gấp đôi" trong SearchView khi tôi nhấp vào nút tìm kiếm trong thanh tác vụ. Tôi có nghĩa là có một thanh tìm kiếm (tối - SearchView) xuất hiện trong một giây trong thanh hành động, và sau đó một thanh thứ hai (màu trắng) xuất hiện trên thanh hành động. Bất kỳ giúp đỡ? Tôi đang làm gì sai? Xin lỗi, điều tìm kiếm này hoàn toàn mới và gây nhầm lẫn cho tôi.Hoạt động tìm kiếm trên Android trong hoạt động đơn lẻ

MainActivity (hoạt động duy nhất):

public class MainActivity extends ActionBarActivity { 
Menu mMenu; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //getSupportActionBar().setDisplayShowTitleEnabled(false); 
    setContentView(R.layout.activity_main); 

    handleIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //use the query to search your data somehow 
    } 
} 

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



    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } 


    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search: 
      onSearchRequested(); 
      return true; 
     default: 
      return false; 
    } 
} 

@SuppressLint("NewApi") 
@Override 
public boolean onSearchRequested() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     MenuItem mi = mMenu.findItem(R.id.search); 
     if(mi.isActionViewExpanded()){ 
      mi.collapseActionView(); 
     } else{ 
      mi.expandActionView(); 
     } 
    } else{ 
     //onOptionsItemSelected(mMenu.findItem(R.id.search)); 
    } 
    return super.onSearchRequested(); 
} 
} 

main.xml (menu xml):

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

<item android:id="@+id/search" 
     android:title="@string/action_settings" 
     android:icon="@drawable/ic_launcher" 
     android:actionProviderClass="android.support.v7.widget.ShareActionProvider" 
     com.brianco.andypedia:showAsAction="always|collapseActionView" 
     com.brianco.andypedia:actionViewClass="android.support.v7.widget.SearchView" /> 

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

</menu> 

searchable.xml:

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

trong biểu hiện:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar" > 
    <activity 
     android:name="com.brianco.andypedia.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> 
    </activity> 

    <meta-data android:name="android.app.default_searchable" 
     android:value=".MainActivity" /> 

Trả lời

2

OK, sự cố phải làm khi gọi onSearchRequested() trong onOptionsItemSelected (mục MenuItem). Đó là dư thừa khi tôi có một SearchView và chỉ nên được gọi trên các nền tảng cũ hơn.

Vì vậy, tôi đã tạo một mục menu riêng cho các thiết bị trong Honeycomb. Nó được gỡ bỏ trong thời gian chạy cho các thiết bị mới hơn. SearchView được xóa khi chạy cho các thiết bị cũ hơn.

Xem cập nhật mã bên dưới:

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



    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     //remove old 
     menu.removeItem(R.id.search_old); 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } else{ 
     //remove new 
     menu.removeItem(R.id.search); 
    } 


    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search_old: 
      onSearchRequested(); 
      return true; 
     default: 
      return false; 
    } 
} 

@SuppressLint("NewApi") 
@Override 
public boolean onSearchRequested() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     MenuItem mi = mMenu.findItem(R.id.search); 
     if(mi.isActionViewExpanded()){ 
      mi.collapseActionView(); 
     } else{ 
      mi.expandActionView(); 
     } 
    } else{ 
     //onOptionsItemSelected(mMenu.findItem(R.id.search)); 
    } 
    return super.onSearchRequested(); 
} 
11

hãy cố gắng thêm thuộc tính sau để <activity> của bạn trong file manifest của bạn:

android:launchMode="singleTop" 

này sẽ làm cho các hoạt động tương tự để nhận mục đích tìm kiếm.

Thông tin thêm ở đây: http://developer.android.com/guide/topics/manifest/activity-element.html

Ngoài ra, bạn có <intent-filter> tuyên bố hai lần, bạn nên kết hợp nó vào một phần tử.

+0

Cảm ơn, tôi đã cập nhật tệp kê khai của mình. Đó không phải là vấn đề của tôi, nhưng nó thực sự là tốt để biết. Xem câu trả lời của tôi cho giải pháp của tôi cho vấn đề tôi đang gặp phải. –

+0

Tuyệt vời, tốt để biết cho tôi quá! – Szymon

+1

Hãy nhớ sử dụng phương thức onNewIntent() để xử lý truy vấn tìm kiếm của bạn như được giải thích bởi Phil. – djondal

21

Từ Setting Up the Search Interface trong Tài liệu Android:

Trong hoạt động tìm kiếm của bạn, xử lý các ý ACTION_SEARCH bởi kiểm tra nó trong phương thức onCreate() của bạn.

Lưu ý: Nếu hoạt động có thể tìm kiếm của bạn khởi chạy ở chế độ đơn hàng đầu (android: launchMode = "singleTop"), cũng xử lý mục đích ACTION_SEARCH trong phương thức onNewIntent(). Ở chế độ một đầu, chỉ một phiên bản hoạt động của bạn được tạo và các cuộc gọi tiếp theo để bắt đầu hoạt động của bạn không tạo hoạt động mới trên ngăn xếp. Chế độ khởi chạy này hữu ích để người dùng có thể thực hiện tìm kiếm từ cùng một hoạt động mà không cần tạo một phiên bản hoạt động mới mỗi lần.

Các vấn đề liên quan