検索ビューが展開されているときに、単一のアクションアイテムが表示された折りたたみ可能な検索ビューでActionBar
を構築する方法よりわかりやすくするために、これが必要です。
他のメニュー項目があり、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
プロパティだけですが、これはディメンションをハードコードすることのみを許可し、より柔軟なソリューションを探しています。 RelativeLayout
をAndroid:layout_toRightOf="@id/search_view"
で試してみましたが、運はありませんでした。
コメントからの提案を検討した後、多くのグーグルとテストは、望ましい効果を得ることに成功しました。私はこのソリューションを誇りに思っていませんが、うまくいきます。複雑すぎず、このケースには十分なはずです。
履歴書で私がやったこと:
SearchView
のcustomView
にActionBar
をカスタム[アイテムの追加]ボタンとともに配置しました。Android:actionLayout
の検索アイテムからcollapseActionView
とmenu.xml
を削除しました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;
}
// ...
}
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"
/>
単純にあなたはこのようにすることができます
@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を使用していますが、あなたの場合は関係ありません
単なる変更メニュー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>