web-dev-qa-db-ja.com

OptionsMenuのSearchViewが全幅ではありません

ユーザーが検索アイコンをタップすると、OptionsMenuに展開される作業用のSearchViewがあります。ただし、他のOptionsMenuアイコンの中で使用可能なスペース内でのみ拡大します。ワイドスクリーンではこれで問題ありませんが、スペースが狭いと、検索ボックスに5〜10文字を表示するスペースしかありません。 Android Contactsアプリ。他のアイコンをオーバーレイします。現在、targetSdkVersion = 17でビルドしています。

(後で追加された注:検索アイコンを展開したいときに、すべてのメニューアイコンを非表示にすることがこれまでのところ有効であることがわかっています。これは概念的には簡単です。どのロジックを復元するか、または状態変数を保持するなどを決定するために、一連のロジックを実行する必要があります)

これが、OptionsMenu用の私のアイテムxmlです。

<item
  Android:id="@+id/menu_search_shallow"
  Android:title="Search Current Folder"
  Android:icon="@drawable/ic_btn_search"
  Android:showAsAction="always|collapseActionView"
  Android:actionViewClass="Android.widget.SearchView" />

私のメインアクティビティコードにもあります:

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
  getMenuInflater().inflate(R.menu.nav_menu, menu);
  this.optionsMenu = menu;

  MenuItem searchItem = menu.findItem (R.id.menu_search_shallow);
  searchItem.setOnActionExpandListener (this);
  SearchView searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_shallow_hint));

  searchItem = menu.findItem (R.id.menu_search_deep);
  searchItem.setOnActionExpandListener (this);
  searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_deep_hint));
}

そして

@Override
public boolean onMenuItemActionExpand(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setOnQueryTextListener (this);
  return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setQuery ("", false);
  return true;
}
35
Peri Hartman

検索バーが幅全体に表示されないという同様の問題がありました(ただし、他のアイコンはありませんでした)。アイテムを追加して解決しました:

Android:actionLayout="@layout/my_search_view"

そして、layout/my_search_view.xmlで:

<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />
3
jjung

新しいレイアウトを作成する代わりに、onCreateOptionsMenu()でプログラムでMaxWidthを設定します。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search, menu);
    SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
    searchView.setMaxWidth(Integer.MAX_VALUE);
    ....
118
clu

何らかの理由でjjungのソリューションはうまくいきませんでした。 Android:maxWidth="10000dp"を追加する必要がありました。これは、非常に高いmaxWidthで、使用可能な全幅に拡張する必要がありました。

また、追加するために、サポートライブラリ(v7)を使用しているため、レイアウトファイルは次のようになります。

<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:maxWidth="10000dp" />

そして私のアイテムには、次のものがあります:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">
    <item
        ...
        myapp:actionLayout="@layout/searchview" />
...

myappは、サポートライブラリによって追加された属性の単なる任意の名前空間です(詳細については、 アクション項目の追加 を参照してください)。

15
mchristie

たぶん私は遅れていますが、それは私と同じ問題に直面した人にとって役に立つかもしれないと思った。

final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);//set search menu as full width

クラスのonCreateOptionsMenuでこの問題を解決できますが、理解する必要があることが1つあります。 (検索ボタンをクリックして)検索メニューのみを表示し、アクションバーに他のメニュー項目を表示しない場合は、検索項目をメニューファイルの最初の項目として保持する必要があります。ここに例があります

        <?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">

<!--keeping searach as first item-->
        <item
            Android:id="@+id/action_search"
            Android:icon="@drawable/search_ab"
            Android:title="@string/search"
            app:actionViewClass="Android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom" />

        <item
            Android:id="@+id/itemFilter"
            Android:icon="@drawable/filter"
            Android:title="@string/filter"
            app:showAsAction="ifRoom" />
    </menu>

そして、それは enter image description here

検索をクリックすると、全幅として表示されます

enter image description here

また、メニューの2番目または最後のアイテムとして検索を続けると、このように表示されます。

enter image description here

検索をクリックすると enter image description here

7

おかしく思えるかもしれませんが、私の場合、問題は次の行でした:menu.xmlのapp:actionViewClass = "Android.widget.SearchView"

 <item
        Android:id="@+id/action_search"
        app:actionViewClass="Android.widget.SearchView"
        Android:icon="@drawable/ic_search"
        Android:title="@string/title"
        app:actionLayout="@layout/layout_search"
        app:showAsAction="always" />

app:actionViewClassを削除すると、layout_searchファイルで定義されたとおりに完全に展開されました。

<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxWidth="10000dp"
Android:layout_centerInParent="true"
Android:background="@color/colorAccent"
Android:queryHint="Search me" />
2
daneejela

この問題を解決する方法はたくさんあります。いくつかのアプリで使用したものを追加するだけです。

Android.support.v7.widget.SearchViewを拡張し、全幅に拡大するために、カスタムSearchView(他のカスタマイズを含む)を使用しています:

@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    super.setLayoutParams(params);
}
1
Oleksandr