在android.support.v7.widget.SearchView的closeButton中使用RTL方向
我正在尝试更改工具栏中SearchView的方向,这是我的尝试 layout.xml在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"
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 :)