我正在尝试在工具栏中更改SearchView的方向,这是我的尝试
layout.xml
android:layoutDirection="rtl"
菜单。 XML
<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" />
Java代码:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
getSupportActionBar().setCustomView(MenuItemCompat.getActionView(searchItem));
mSearchView.setInputType(InputType.TYPE_CLASS_TEXT);
mSearchView.setQueryHint(getString(R.string.search_hint));
mSearchView.setGravity(Gravity.RIGHT);
mSearchView.setTextDirection(View.TEXT_DIRECTION_RTL);
mSearchView.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
mSearchView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
mSearchView.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
这就是结果,我成功将SearchView添加到工具栏,现在是RTL。但问题是“X”(closeButton)的位置是错误的,位置必须在左边。
在您的应用程序中支持Rtl
。你必须在manifest.xml中设置android:supportsRtl="true"
。
最重要的一点是记住
将所有应用程序的"Left/Right"
布局属性更改为Start/End
。
在你的情况下,你正在设置。
mSearchView.setGravity(Gravity.RIGHT);
所以改成它
mSearchView.setGravity(Gravity.END);
而且这里也改变了
mSearchView.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
至
mSearchView.setLayoutParams(new ActionBar.LayoutParams(Gravity.END));
添加此更改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。但layoutDirection
在toobar内的其他布局不会改变。和带有关闭按钮的editText是嵌套布局。
所以你必须找到父布局并改变它的方向。如果你看到里面的SearchView布局文件。你会发现退出按钮位于带有search_plate
id的布局中
所以在onCreateOptionsMenu
设置SearchView
之后这样做
科特林
mSearchView.findViewById<View>(R.id.search_plate)?.let {
it.layoutDirection = View.LAYOUT_DIRECTION_RTL
}
java的
((View) mSearchView.findViewById(R.id.search_plate))
.setLayoutDirection(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) }
}
}
}
像这样使用它
view.rtl() //and view become rtl :)