Android SearchView - 向右移动图标(没有 ActionBar)

Android SearchView - Move icon to right (without ActionBar)

我有一个像这样的 android SearchView -

 <SearchView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:queryHint="Search the forum ..."
        android:iconifiedByDefault="true"
        android:id="@+id/search_forum"
        android:layout_alignParentRight="true"
        android:textColor="#aaa" />

这不在我的 ActionBar 中,它在我的其他地方 activity。

我需要将图标(搜索图标)留在布局的右侧。单击它应该扩展到 SearchView(与 ActionBar SearchView 相同的行为)。我试过了 android:layout_alignParentRight="true" 但图标一直在左边。

任何帮助都会很棒 :)

我找不到确切的答案所以我这样做了- 创建带有搜索图标的图像视图。把它放在我的布局的右边。 单击时,使搜索视图可见并设置 iconified false 并请求搜索视图的焦点。

如果有人最终能帮我找到合适的解决方案,我将不胜感激。

将 SearchView 添加为菜单项而不是工具栏元素从根本上解决了问题。

一种优雅的方式:

步骤 1 - 将搜索字段添加到您的工具栏:

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="Search"/>

步骤 2 - 将逻辑添加到您的 onCreateOptionsMenu()

import android.support.v7.widget.SearchView; // not the default !

@Override
public boolean onCreateOptionsMenu( Menu menu) {
    getMenuInflater().inflate( R.menu.main, menu);

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}

来源:

如果问题仍未得到解答:

只需将 SearchView 移动到 RelativeLayout 中,并将其与父级的右侧对齐:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.SearchView
    android:layout_width="wrap_content"
    android:id="@+id/searchView"
    android:layout_alignParentRight="true"
    android:layout_height="match_parent" />

最终结果如下所示:

CardView with Linearlayout containing aligned SearchView

我找到了解决这个问题的方法。只需将布局方向设置为 "rtl",图标将位于右侧。这是我的搜索视图的代码,它按预期工作。

<SearchView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layoutDirection="rtl"
    android:iconifiedByDefault="true"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

试试这个:

 SearchView searchView =
       (SearchView) findViewById(R.id.search_view);
    searchView.setIconifiedByDefault(false);
    searchView.setIconified(false);

  ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);

    ViewGroup linearLayoutSearchView =
       (ViewGroup) searchViewIcon.getParent();
    linearLayoutSearchView.removeView(searchViewIcon);
    linearLayoutSearchView.addView(searchViewIcon);

摘自 here.

这种方式对我有用。我使用工具栏而不是 ActionBar。

searchView.setLayoutParams(new Toolbar.LayoutParams(Gravity.RIGHT)); 

除了工具栏之外,我对 SearchView 的要求完全相同,即当折叠搜索图标时应位于右端,展开时应覆盖整个宽度。

我已经在 RelativeLayout 中为 SearchView 尝试了这个解决方案。

<androidx.appcompat.widget.SearchView
    android:id="@+id/searchView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true" />

并在代码中处理 OnSearchClickListenerOnCloseListener 以在 MATCH_PARENTWRAP_CONTENT 之间切换宽度。

searchView.setOnSearchClickListener {
    val params = it.layoutParams as RelativeLayout.LayoutParams
    params.width = RelativeLayout.LayoutParams.MATCH_PARENT
    it.layoutParams = params
}

searchView.setOnCloseListener {
    val params = searchView.layoutParams as RelativeLayout.LayoutParams
    params.width = RelativeLayout.LayoutParams.WRAP_CONTENT
    searchView.layoutParams = params

    return@setOnCloseListener false
}