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

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

我正在尝试在工具栏中更改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 in actionBar Wrong position of closeButton

这就是结果,我成功将SearchView添加到工具栏,现在是RTL。但问题是“X”(closeButton)的位置是错误的,位置必须在左边。

android android-layout android-studio widget searchview
3个回答
1
投票

在您的应用程序中支持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));

1
投票

添加此更改x方向:

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

0
投票

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

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

0
投票

问题是,当您将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)

Update

或者您也可以将此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 :)
© www.soinside.com 2019 - 2024. All rights reserved.