2013-03-15 37 views
20

Làm cách nào để xây dựng ActionBar với chế độ xem tìm kiếm có thể thu gọn với một mục tác vụ có thể nhìn thấy, khi chế độ xem tìm kiếm được mở rộng? Để mô tả chi tiết hơn, đây là những gì tôi cần:Android ActionBar: có thể mở SearchView với nút hành động

enter image description here Lưu ý rằng có các mục menu khác và android:uiOptions="splitActionBarWhenNarrow" được xác định trong AndroidManifest.xml.

Tôi cố gắng để thiết lập tùy chỉnh bố cục mục tìm kiếm:

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" /> 

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal" > 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new"/> 

</LinearLayout> 

Nhưng bởi defaul t tìm kiếm xem tất cả các chiều rộng có sẵn và nút là không nhìn thấy được. Tôi không biết cách buộc SearchView điền vào tất cả không gian có sẵn giữa biểu tượng ứng dụng và mục menu. Tất cả tôi tìm thấy là tài sản android:maxWidth, nhưng điều này chỉ cho phép kích thước mã hóa cứng, và tôi đang tìm kiếm một số giải pháp linh hoạt hơn. Tôi cũng đã thử RelativeLayout với android:layout_toRightOf="@id/search_view" mà không có may mắn.

Trả lời

9

Sau khi xem xét lời đề nghị từ các ý kiến, nhiều googling và thử nghiệm thành công trong việc đạt được hiệu quả mong muốn. Tôi không tự hào về giải pháp này nhưng nó hoạt động, nó không quá phức tạp và nên là đủ cho trường hợp này.

Trong hồ sơ những gì tôi đã làm:

  1. Đặt SearchView với tùy chỉnh "thêm mục" nút trong customView của ActionBar.
  2. Removed collapseActionViewandroid:actionLayout từ mục tìm kiếm trong menu.xml
  3. Việc thu gọn/mở rộng SearchView lập trình.

Một số mã để hiểu rõ hơn về những gì tôi đã làm. Có lẽ điều này có thể hữu ích cho ai đó.

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always" 
    android:title="@string/search" /> 

// ... other menu items 

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal"> 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" 
     android:visibility="invisible" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new" 
     android:title="@string/add_item" /> 

</LinearLayout> 

MainActivity.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 
    actionBar.setCustomView(R.layout.actionbar_search); 
    actionBarCustomView = ab.getCustomView(); 
    searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view)); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      searchView.setVisibility(View.INVISIBLE); 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // ... 
     case R.id.menu_search: 
      if (searchView.getVisibility() == View.VISIBLE) { 
       searchView.setIconified(true); 
       searchView.setVisibility(View.INVISIBLE); 
      } else { 
       searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth()); 
       searchView.setVisibility(View.VISIBLE); 
       searchView.setIconified(false); 
      } 
      break; 
     // ... 
    } 
    return true; 
} 

@Override 
public void onBackPressed() { 

    if (searchView.getVisibility() == View.VISIBLE) { 
     searchView.setIconified(true); 
     searchView.setVisibility(View.INVISIBLE); 
     return; 
    } 

    // ... 
} 
+0

Xin chào, tôi đã thử giải pháp trên nhưng không hoạt động. Trong thực tế, tôi không thể nhìn thấy bất kỳ mục hành động nào. – AndoAiron

+0

Bạn có thể gửi các đoạn mã của bạn (ví dụ như gist) không? Tôi đã dành vài ngày để tìm hiểu và thử nghiệm, nghĩ rằng tôi có thể giúp đỡ. –

+0

Tôi nên đăng đoạn mã của mình ở đâu ?? Tôi không thể đăng mã vấn đề của tôi ở đây dưới dạng nhận xét. Ngoài ra, bạn có thể vui lòng giúp tôi đạt được điều này: http://stackoverflow.com/questions/15947557/sherlockactionbar-with-autocompletetextview-and-other-items?noredirect=1#comment22723847_15947557 – AndoAiron

2

Bạn chỉ có thể làm điều đó bằng cách sử dụng yourmenu.xml.

Đặt biểu tượng trình đơn khác của bạn để luôn hiển thị dưới dạng hành động. menu.xml của bạn sẽ trông như thế này:

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 
<item 
    android:id="@+id/your_other_menu_id" 
    android:showAsAction="always" 
    android:icon="@android:drawable/your_other_menu_ic" 
/> 
+0

Đã thử phương pháp này. Như tôi đã đề cập, có các mục menu khác và tất cả chúng đều tràn vào thanh tác vụ phía dưới. Và tôi cần thêm hành động này luôn được đặt ở góc trên cùng bên phải. –

+1

Chi tiết trong trường hợp này là thanh tác vụ chia tách chứ không phải là chế độ xem tìm kiếm có thể thu gọn. Kiểm tra liên kết dưới đây. Không thể đặt hành vi này bằng cách sử dụng các đối tượng gốc. Bạn sẽ cần tạo thanh tác vụ tùy chỉnh của riêng mình. http://stackoverflow.com/questions/8571754/android-split-action-bar-with-action-items-on-the-top-and-bottom – JPMagalhaes

+0

Cảm ơn lời khuyên, nhưng tôi cũng đã thử cách này. Custom ActionBar cho tôi chế độ xem tùy chỉnh khi SearchView bị thu gọn. Sau đó, tôi có nút duy nhất của tôi ở thanh trên cùng và các menu.xml biểu mẫu ở dưới cùng. Vấn đề là khi SearchView được mở rộng. Tôi cần phải ép buộc để lấp đầy tất cả không gian có sẵn giữa biểu tượng ứng dụng và mục tác vụ duy nhất. Tôi đã thử hiểu những gì đang xảy ra trong 'onMeasure()' của lớp SearchView nhưng không chính xác hiểu những gì tôi có thể làm với điều này, và nếu nó là, ở tất cả, một hướng đúng. Bất kỳ trợ giúp sẽ được đánh giá cao. –

1

Đơn giản chỉ cần bạn có thể làm điều đó như thế này

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchView.setIconified(true); //to be opened collapsed 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 

     case R.id.action_search: 
      searchView.setIconified(false);// to Expand the SearchView when clicked 
      return true; 
    }  
    return false; 
} 

Và tại mục tìm kiếm ở menu.xml làm

showAsAction = "always"

Lưu ý: Tôi đang sử dụng android.support.v7.widget.SearchView nhưng trong trường hợp của bạn, nó không quan trọng

+1

không hoạt động đối với tôi: (( –

+0

Mã này có bị ngừng sử dụng không? – HMagdy

+0

@salma có bạn phải android.support.v7.widget.SearchView và android.widget.searchview vấn đề của nó rất nhiều –

0

Chỉ cần trình đơn thay đổi xml. tiền tố hiển thị cho tên ứng dụng của bạn

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

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    app:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 

</menu> 
Các vấn đề liên quan