簡體   English   中英

android工具欄中SearchView的正確實現

[英]Correct implementation of SearchView in android toolbar

我在 android 工具欄中的 searchview 實現有問題。

  1. 空白空間填充太大。
  2. 我不想隱藏其他操作,但這些操作與 SearchView 重疊。
  3. SearchView 的下划線不可見

我如何解決上述問題?

在此處輸入圖片說明

菜單文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

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

    <item
        android:id="@+id/action_add_client"
        android:icon="@drawable/ic_account_multiple_plus"
        android:title="@string/action_add_client"
        app:showAsAction="always" />
</menu>

分段

@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_fragment_reg_vehicles, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setQueryHint("Search");
    searchView.setMaxWidth(Integer.MAX_VALUE);
    searchView.setIconifiedByDefault(false);
    searchView.setOnQueryTextListener(this);
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            setItemsVisibility(menu, item, true);
            return false;
        }
    });
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setItemsVisibility(menu, item, false);
            searchView.requestFocus();
        }
    });
}

關於您發布的代碼,這是輸出:

默認情況下帶有 SearchView AppCompat 的工具欄

如您所見,有兩個左邊距:小部件的容器和放大圖標。 這就是為什么你有一個比另一個帶有標題的窗口更大的空白空間。 菜單項被推到工具欄之外,我認為,當它不是CollapseActionView時,它是默認的 SearchView ActionView ,因此它填充父級。

SearchView小部件的來源及其布局abc_search_view.xml ,我試圖刪除額外的邊距並避免將其他項目推到工具欄之外。
但是經過多次操作后,我的猜測是您必須使用自定義小部件和/或自定義布局。 或者使用setIconifiedByDefault(true)刪除放大圖標及其額外邊距並使用setMaxWidth(MAX_SIZE)其中MAX_SIZEInteger.MAX_VALUE - (SIZE_OF_A_MENU_ITEM * NB_OF_MENU_ITEMS)動態計算......但它需要大量工作沒有。 因此,使用自定義布局可能是解決方案。

但是,有一種可能的方法來保留 appcompat 小部件,一些小的變通方法。 首先,為了避免推出其他項目,您可以使用CollapseActionView

<item
    ...
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>

並且為了保持你的需求,你必須在初始化時擴展它:

final SearchView searchView =
            (SearchView) MenuItemCompat.getActionView(item);
MenuItemCompat.expandActionView(item);

請注意,如果您不想折疊項目,則必須使用setOnActionExpandListener()來關閉窗口。 這個建議會給你這個結果:

帶有 SearchView AppCompat 擴展的工具欄

仍然是額外的邊距,對吧? 因此,您必須通過它們的 id 檢索容器和放大圖標(您可以在abc_search_view.xml找到abc_search_view.xml ……但讓我們節省一些時間:它們是R.id.search_edit_frameR.id.search_mag_icon )。 您可以使用此方法刪除它們的邊距:

private void changeSearchViewElements(View view) {
    if (view == null) 
        return;

    if (view.getId() == R.id.search_edit_frame
            || view.getId() == R.id.search_mag_icon) {
        LinearLayout.LayoutParams p = 
                (LinearLayout.LayoutParams) view.getLayoutParams();
        p.leftMargin = 0; // set no left margin
        view.setLayoutParams(p);
    }

    if (view instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup) view;
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            changeSearchViewElements(viewGroup.getChildAt(i));
        }
    }
}

通過在線程中調用它:

final SearchView searchView =
            (SearchView) MenuItemCompat.getActionView(item);
...
searchView.post(new Runnable() {
        @Override
        public void run() {
            changeSearchViewElements(searchView);
        }
    });

這是輸出:

帶有 SearchView AppCompat 的工具欄,沒有左邊距

最后,為了獲得字段下的線條,有一個可能的解決方法,即使用 9-patch drawable 並將其設置為背景。 您可以在 Google 上輕松找到操作方法。 所以條件將是:

private void changeSearchViewElements(View view) {
    ...
    if (view.getId() == R.id.search_edit_frame
            || view.getId() == R.id.search_mag_icon) {
        LinearLayout.LayoutParams p = 
                (LinearLayout.LayoutParams) view.getLayoutParams();
        p.leftMargin = 0; // set no left margin
        view.setLayoutParams(p);

    } else if (view.getId() == R.id.search_src_text) {
        AutoCompleteTextView searchEdit = (AutoCompleteTextView) view;
        searchEdit.setBackgroundResource(R.drawable.rect_underline_white);
    }
    ...
}

從下面的 OP 評論中,下划線的字段也可以使用以下語句完成:

searchView.findViewById(android.support.v7.appcompat.R.id.se‌​arch_src_text)
        .setBa‌​ckgroundResource(R.d‌​rawable.abc_textfiel‌​d_search_default_mtr‌​l_alpha);

在這些解決方法之后,正如我所說,使用自定義布局可能會更容易。 但是如果您想保留默認的 SearchView 小部件,這可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM