如何在Android中获取文本方向并根据方向动态更改布局?

Hes*_*sam 16 android bidi internationalization

我正在研究基于文本方向动态更改UI的可行性.虽然Google支持RTL语言(参考:Android 4.2中的Native RTL支持),但它不包括应用程序混合了LTR和RTL内容的情况.

谷歌的解决方案是正确的,如果我们有多语言应用程序,它有不同语言的不同静态数据源(如菜单项).但是,我没有找到任何其他文档关于如何根据文本内容的方向动态更改布局.

下图显示了我的测试应用程序的当前设计.列表来自Facebook(我的朋友列表),包含英文和波斯名字.

在此输入图像描述

我的解决方案是在适配器中有两个布局(一个用于LTR,一个用于RTL),并根据名称的方向分配每个布局.所以,我写了以下几行代码:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

            if(position % 2 == 0)
                convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
            else
                convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);

            holder = new ViewHolder();

            holder.llSection = (LinearLayout) convertView.findViewById(R.id.section);
            holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName);
            holder.ivPicture = (ImageView) convertView.findViewById(R.id.ivPicture);
            holder.btnAdd = (Button) convertView.findViewById(R.id.btnAdd);

            convertView.setTag(holder);



        holder.btnAdd.setTag(position);
        holder.tvUserName.setText(userList.get(position).getName());
        imageDownloader.displayImage(holder.ivPicture, userList.get(position).getPhotoUrl());

        ...

        return convertView;
    }
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

我根据行是偶数还是奇数来镜像行.现在,我的问题是如何根据名称镜像UI.我想我应该将条款条件if(position % 2 == 0)改为类似的条件if(isNameLTR(FIRST_CHAR_OF_NAME)).我不知道如何实现这个方法.

我怎么知道一个角色是LTR还是RTL?(我认为Android知道单词的第一个字符是RTL或LTR,这就是为什么当文本视图的宽度与父级匹配时,如果字符是RLT则将文本对齐到右边,如果字符是LTR则向左对齐).

任何建议或意见将不胜感激.谢谢

Hes*_*sam 30

解决方案,我想的更容易:)感谢JAVA

有比课程.此类具有getBaseLevel()方法,如果文本是从左到右,则返回0,否则返回1(如果从右到左).

所以,这是我的代码:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
        if(bidi.getBaseLevel() == 0)
            convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
        else
            convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);

...
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

=============

更新:

还有另一种方法,baseIsLeftToRight()可能更适合在if语句中使用.结果与上述相同.

Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
if(bidi.baseIsLeftToRight())
                convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
            else
                convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);
Run Code Online (Sandbox Code Playgroud)