Android SearchView - 向右移动图标(不带ActionBar)

问题描述 投票:3回答:7

我有一个像这样的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中,它在我的活动中的其他地方。

我需要图标(搜索图标)保持在我的布局右侧。点击它应该扩展到SearchView(与ActionBar SearchView相同的行为)。我尝试了android:layout_alignParentRight="true",但图标保持在左侧。

任何帮助都会很棒:)

android searchview
7个回答
7
投票

我找到了解决这个问题的方法。只需将布局方向设置为“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" />

2
投票

如果问题仍然没有答案:

只需将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


1
投票

我无法找到确切的答案所以我这样做了 - 用搜索图标创建一个图像视图。将它放在我的布局右侧。单击时,使搜索视图可见并设置图标化为false并请求焦点为搜索视图。

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


1
投票

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

资料来源:https://stackoverflow.com/a/34255229/384564


0
投票

试试这个:

 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


0
投票

除了工具栏之外,我对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
}

-1
投票

以这种方式为我工作。我使用Toolbar而不是ActionBar。

searchView.setLayoutParams(new Toolbar.LayoutParams(Gravity.RIGHT)); 
© www.soinside.com 2019 - 2024. All rights reserved.