Ответ 1
Вы можете сделать это программно
SearchView search = (SearchView) item.getActionView();
search.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
Вот мой макет, используя android.support.v7.widget.SearchView
.
Я хочу переместить значок поиска в нужную сторону, но я не нашел никакого метода...
`
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.SearchView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tab_main_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
`
после того, как я нажму значок, он изменится на этот макет
Вы можете сделать это программно
SearchView search = (SearchView) item.getActionView();
search.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
Вы можете добавить действие поиска в menu.xml, как показано ниже:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/action_search"
android:icon="@mipmap/ic_search_white_24dp"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" />
<item android:id="@+id/action_download"
android:title="@string/menu_action_download"
android:icon="@mipmap/ic_file_download_white_24dp"
android:orderInCategory="100"
app:showAsAction="always" />
</menu>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/AppTheme.PopupOverlay">
<RelativeLayout
android:id="@+id/not"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<android.support.v7.widget.SearchView
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tab_main_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
Попробуйте это... Он выглядит так, как вы ожидаете. Просто добавьте эту строку внутри тега SearchView.
Android: гравитация = "вправо"
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.SearchView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right" />
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tab_main_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Если вы хотите использовать SearchView
вне ActionBar
в любом другом представлении (например, ConstraintLayout
), вы можете использовать подход, размещенный на этот сайт. В основном значок находится в ImageView
, расположенном в начале макета (или я могу сказать, что это первый элемент, добавленный к его родительскому элементу). С помощью этого кода вы его ищите, затем удалите его из родителя и, наконец, вернете. Результат: он будет размещен на "конце" виджета SearchView
... проблема решена...
//Get ImageView of icon
ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
//Get parent of gathered icon
ViewGroup linearLayoutSearchView = (ViewGroup) searchViewIcon.getParent();
//Remove it from the left...
linearLayoutSearchView.removeView(searchViewIcon);
//then put it back (to the right by default)
linearLayoutSearchView.addView(searchViewIcon);
Протестировано, работает, удовлетворено...;)
Установка гравитации SearchView
вправо через xml или программно работает, но когда расширение SearchView
было расширено, оно занимало небольшую площадь по ширине справа, что не было предполагаемым видом, который я имел в виду, я хотел, чтобы он занимал всю ширину.
Примечание 1: Это решение не позволило отобразить заголовок, поэтому я добавил TextView
, чтобы сохранить заголовок.
Примечание 2: Когда расширение SearchView
было расширено, оно накладывалось бы на пользовательский заголовок, поэтому я создал фон SearchView
в качестве панели инструментов, чтобы избежать скрытия/отображения заголовка с помощью SearchView
expand/collapse
Вот код Toolbar
:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<TextView
android:id="@+id/toolbar_title"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="Toolbar Title"
android:textColor="@android:color/white" />
<android.support.v7.widget.SearchView
android:id="@+id/search_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?attr/colorPrimary"
android:gravity="right" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
Внутри действия я использовал слушателей Close и SearchClick для выравнивания SearchView
влево.
mSearchView = findViewById(R.id.search_view);
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) mSearchView.getLayoutParams();
param.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
//set layout params to cause layout update
mSearchView.setLayoutParams(param);
return false;
}
});
mSearchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) mSearchView.getLayoutParams();
param.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
//set layout params to cause layout update
mSearchView.setLayoutParams(param);
}
});