从右到左的SnackBar

30

我想在设计支持库SnackBar上显示一个带操作文本。我的语言是从右到左书写的,那么我该如何改变SnackBar文本和操作的方向呢?
类似于这样:

输入图像描述

6个回答

36

最后,通过回答和更多的搜索,我找到了这个解决方案:

Snackbar snackbar =
    Snackbar.make(view, "My right2left text", Snackbar.LENGTH_LONG)
            .setAction("Action", new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                }
             });

设置方向为从右到左:

ViewCompat.setLayoutDirection(snackbar.getView(),ViewCompat.LAYOUT_DIRECTION_RTL);

不要忘记在显示 Snackbar 时使用这个:

snackbar.show();

更新

由于您将TextAction作为TextView,因此您可以对它们使用其他TextView方法,例如setTypeface()setTextSize()等。

设置文本字体:

TextView text = snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
text.setTypeface(yourTypeface);

设置操作的字体:

TextView action = snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);
action.setTypeface(yourTypeface);

1
在Android 17以下的版本中,可以使用android.support.v4.view.ViewCompat中的ViewCompat来实现此功能。请参考https://dev59.com/tV0a5IYBdhLWcg3wVHTU#37670836。 - M at
简单而实用 - taha
你救了我的一天 ;) - Milad Faridnia

5

只需添加以下代码:

在应用程序标签下的Android清单中保留此内容

android:supportsRtl="true"

以及这个:

Snackbar snackbar = Snackbar.make(getView(), "Text", Snackbar.LENGTH_SHORT);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    TextView view1 = (TextView)snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
    view1.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}

snackbar.show();

好的,但是当您想要为应用程序使用RTL方向时它非常有用。 在某些情况下,您希望为应用程序使用LTR方向,并为某些小部件使用RTL方向。 - Seyyed

2
你需要根据本地设置来进行这个操作。Android支持这个功能。
从Android API 17及以上版本开始,它原生支持RTL。如果想要强制整个布局包括ActionBar都是RTL,请按照以下步骤进行。
在Android清单文件中,在应用程序标签下保留此设置。
android:supportsRtl="true"

在 Utils 类中定义一个像这样的方法。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static void getRtlSupport() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
    }  
} 

使用此存储库作为参考,并将其实现为 snackbar。

https://github.com/semsamot/ActionBarRTLizer.git


谢谢,那API Level 17怎么样?我的应用程序最小SDK是14。 - Seyyed
这不是最佳实践。在Android应用程序开发中,避免RTL语言爱好者遇到奇怪问题的更好方法是创建自定义RTL布局并在整个应用程序中进行膨胀,例如具有自定义RTL布局的工具栏在每个API中都具有更好的性能,而不是选择Android RTL支持并强制布局为RTL。这是我的经验。感谢耐心的读者。 - Setmax

2

0

你只需要:

         Snackbar snackbar=Snackbar.make(v, "آیا از حذف کامل این مورد مطمئن هستید؟", Snackbar.LENGTH_LONG)
                    .setAction("حذف", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                           //info@giran.ir
                           //09155336168
                        }
                    });
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                View snack = snackbar.getView();
                snack.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
            }

            snackbar.show();

0
private void showSnackbar(String text, int Length, String Action, View.OnClickListener clickListener) {
    Snackbar snackbar = Snackbar.make(findViewById(R.id.coordinatorLayout), text, Length);
    View snack = snackbar.getView();
    snackbar.getView().setRotationY(180);
    snack.setBackgroundColor(getResources().getColor(R.color.DarkBlue));
    TextView snack_text = (TextView)snack.findViewById(android.support.design.R.id.snackbar_text);
    TextView snack_action = (TextView)snack.findViewById(android.support.design.R.id.snackbar_action);
    snack_text.setTypeface(tf);
    snack_action.setTypeface(tf);
    snack_action.setRotationY(180);
    snack_text.setRotationY(180);
    snackbar.setAction(Action, clickListener);
    snackbar.setActionTextColor(Color.parseColor("#00c4ff"));
    snackbar.show();
}

请解释您的代码如何解决问题以及为什么,因为在StackOverflow上,仅有代码的答案是不被赞赏的。此外,您可以解释为什么您的答案超过了先前较旧的答案(主要是已接受的答案)。 - Lukas Körfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接