Voici ma mise en page, en utilisant Android.support.v7.widget.SearchView
. Je souhaite déplacer l’icône de recherche sur le côté droit, mais je n’ai trouvé aucune méthode ... `
<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>
`
après avoir cliqué sur l'icône, cette disposition sera modifiée
Vous pouvez le faire par programme
SearchView search = (SearchView) item.getActionView();
search.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
Vous pouvez ajouter une action de recherche dans menu.xml comme ci-dessous:
<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>
Régler la gravité SearchView
à droite à travers xml ou par programmation fonctionne, mais lorsque la variable SearchView
a été étendue, elle prenait une petite zone de la largeur à droite, ce qui n’était pas le style que j’avais en tête. largeur.
Remarque 1: Cette solution ne permettait pas l'affichage du titre, j'ai donc ajouté une TextView
pour le conserver.
Remarque 2: lorsque la variable SearchView
était étendue, elle chevauchait le titre personnalisé. J'ai donc créé l'arrière-plan SearchView
comme barre d'outils pour éviter de masquer/afficher le titre avec les propriétés de développement/réduction de SearchView
Voici le code 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>
À l’intérieur de l’activité, j’ai utilisé les écouteurs Close et SearchClick pour aligner la variable SearchView
à gauche.
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);
}
});
vous pouvez essayer le layoutdirection. réglez-le sur "rtl"
Android: layoutDirection = "rtl" dans votre searchview xml:
<Android.support.v7.widget.SearchView
Android:id="@+id/searchView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:layout_marginRight="11.4dp"
app:iconifiedByDefault="true"
Android:animateLayoutChanges="true"
app:queryHint="@string/search_hint"
app:queryBackground="@Android:color/transparent"
app:searchHintIcon="@drawable/empty_drawable"
app:closeIcon="@drawable/close_x_icon"
**Android:layoutDirection="rtl"**
app:searchIcon="@drawable/magnifying_glass"
/>
n'oubliez pas de mettre ceci dans votre tag d'application manifeste:
Android:supportsRtl="true"
Essayez ceci ... Il ressemble à ce que vous attendez. Ajoutez simplement cette ligne dans la balise SearchView.
Android: gravity = "right"
<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" />
Probablement trop tard pour la réponse, mais cela a fonctionné pour moi, comme vous pouvez le voir sur le screenshot ci-joint.
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary"
Android:minHeight="?attr/actionBarSize"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_constraintBottom_toTopOf="@+id/relativeLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:title="Contacts">
<Android.support.v7.widget.SearchView
Android:id="@+id/searchView"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="end"
Android:gravity="center_vertical"
app:queryHint="Search" />
</Android.support.v7.widget.Toolbar>
Si vous souhaitez utiliser SearchView
en dehors de ActionBar
dans une autre vue (disons par exemple ConstraintLayout
), vous pouvez utiliser l'approche publiée sur this site. En gros, l’icône est dans une ImageView
positionnée au début de la présentation (ou je pourrais dire "c’est le premier élément ajouté à son parent"). Avec ce code, vous le recherchez, puis le supprimez du parent et le remettez enfin en place. Le résultat: il sera positionné à la "fin" du widget SearchView
... problème résolu ...
//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);
Testé, fonctionnel, satisfait ...;)