在android.support.v7.widget.SearchView的closeButton中使用RTL方向

在android.support.v7.widget.SearchView的closeButton中使用RTL方向,android,android-layout,android-studio,widget,searchview,Android,Android Layout,Android Studio,Widget,Searchview,我正在尝试更改工具栏中SearchView的方向,这是我的尝试 layout.xml android:layoutDirection="rtl" <item android:id="@+id/action_search" android:title="@string/search_hint" android:icon="@mipmap/ic_search_icon" app:showAsAction="ifRoom|collapseActionView"

我正在尝试更改工具栏中SearchView的方向,这是我的尝试

layout.xml

android:layoutDirection="rtl"
<item android:id="@+id/action_search"
    android:title="@string/search_hint"
    android:icon="@mipmap/ic_search_icon"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView" />
menu.xml

android:layoutDirection="rtl"
<item android:id="@+id/action_search"
    android:title="@string/search_hint"
    android:icon="@mipmap/ic_search_icon"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView" />


这就是结果,我成功地将SearchView添加到工具栏,现在是RTL。但问题是“X”(关闭按钮)的位置错误,该位置必须位于左侧。

要在应用程序中支持
Rtl
。您必须在manifest.xml中设置android:supportsRtl=“true”

记住最重要的一点

将应用程序的所有
“左/右”
布局属性更改为
开始/结束

在您的情况下,您正在设置

mSearchView.setGravity(Gravity.RIGHT);
所以把它改成

mSearchView.setGravity(Gravity.END);
这里也换了这个

mSearchView.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));


添加此项以更改x方向:

    View xIcon = ((ViewGroup) mSearchView.getChildAt(0)).getChildAt(2);
    xIcon.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

您可以使用此方法在RTL语言环境中将closeButton向右移动:

  private static void handleCloseButtonRtlIssue(SearchView searchView) {
        ((LinearLayout) ((LinearLayout) searchView.getChildAt(0)).getChildAt(2)).getChildAt(1).setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
    }

问题是,当您将
layoutDirection
更改为rtl时,工具栏本身将变成rtl。但是toobar内部其他布局的
layoutDirection
不会更改。和带有关闭按钮的editText位于嵌套布局中

所以你必须找到父布局并改变方向。如果您看到内部SearchView布局文件。您会发现退出按钮位于带有
search\u plate
id的布局中

因此,在
oncreateoptions菜单中
安装后
SearchView
执行此操作

kotlin

mSearchView.findViewById<View>(R.id.search_plate)?.let {
    it.layoutDirection = View.LAYOUT_DIRECTION_RTL
}
更新 或者您也可以将此kotlin扩展用于其他rtl问题

fun ViewGroup.rtl() {
    val stack = Stack<View>()
    stack.add(this)
    while (stack.isNotEmpty()) {
        stack.pop().apply {
            layoutDirection = View.LAYOUT_DIRECTION_RTL
            textDirection = View.TEXT_DIRECTION_RTL
            (this as? ViewGroup)?.children?.forEach { stack.add(it) }
        }
    }
}

您可以使用工具栏的自定义布局@KaushalideSilva我的问题在SearchView中,而不是在工具栏中我已经将
android:supportsRtl=“true”
添加到我的manifest.xml中,我只是将
Gravity.RIGHT
替换为
Gravity.END
。但x按钮位置也存在同样的问题
fun ViewGroup.rtl() {
    val stack = Stack<View>()
    stack.add(this)
    while (stack.isNotEmpty()) {
        stack.pop().apply {
            layoutDirection = View.LAYOUT_DIRECTION_RTL
            textDirection = View.TEXT_DIRECTION_RTL
            (this as? ViewGroup)?.children?.forEach { stack.add(it) }
        }
    }
}
view.rtl() //and view become rtl :)