web-dev-qa-db-ja.com

Android ActionBar:アクションボタン付きの折りたたみ可能なSearchView

検索ビューが展開されているときに、単一のアクションアイテムが表示された折りたたみ可能な検索ビューでActionBarを構築する方法よりわかりやすくするために、これが必要です。

enter image description here 他のメニュー項目があり、Android:uiOptions="splitActionBarWhenNarrow"AndroidManifest.xmlで定義されていることに注意してください。

カスタム検索アイテムのレイアウトを設定しようとしました:

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>

ただし、デフォルトでは、検索ビューでは使用可能なすべての幅が使用され、ボタンは表示されません。アプリのアイコンとメニュー項目の間の利用可能なすべてのスペースをSearchViewで強制的に埋める方法がわかりません。私が見つけたのはAndroid:maxWidthプロパティだけですが、これはディメンションをハードコードすることのみを許可し、より柔軟なソリューションを探しています。 RelativeLayoutAndroid:layout_toRightOf="@id/search_view"で試してみましたが、運はありませんでした。

20
Rafal Gałka

コメントからの提案を検討した後、多くのグーグルとテストは、望ましい効果を得ることに成功しました。私はこのソリューションを誇りに思っていませんが、うまくいきます。複雑すぎず、このケースには十分なはずです。

履歴書で私がやったこと:

  1. SearchViewcustomViewActionBarをカスタム[アイテムの追加]ボタンとともに配置しました。
  2. Android:actionLayoutの検索アイテムからcollapseActionViewmenu.xmlを削除しました
  3. プログラムでSearchViewを折りたたみ/展開します。

私がやったことをよりよく理解するためのいくつかのコード。たぶん、これは誰かにとって役に立つかもしれません。

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;
    }

    // ...
}
9
Rafal Gałka

Yourmenu.xmlを使用してのみ実行できます。

他のメニューアイコンを設定して、常にアクションとして表示します。 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"
/>
<item
    Android:id="@+id/your_other_menu_id"
    Android:showAsAction="always"
    Android:icon="@Android:drawable/your_other_menu_ic"
 />
2
JPMagalhaes

単純にあなたはこのようにすることができます

@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;
}

そして、menu.xmlの検索項目でmake

showAsAction = "always"

注:私はAndroid.support.v7.widget.SearchViewを使用していますが、あなたの場合は関係ありません

1
Salma

単なる変更メニューxml。アプリ名のshowactionプレフィックス

<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>
0
nadafafif