Android Text 应该出现在 Switch 的两侧

Posted

技术标签:

【中文标题】Android Text 应该出现在 Switch 的两侧【英文标题】:Android Text should appear both side in the Switch 【发布时间】:2014-04-26 21:46:23 【问题描述】:

我使用自定义开关来支持 API 8。我使用 THIS Libarary 进行自定义开关。但是我想做一些如图所示的东西。我试图改变颜色,虽然改变了样式中的颜色但没有达到我想要的效果。

请帮助我,在此先感谢。

【问题讨论】:

【参考方案1】:

尝试使用

android:textOn="On"
android:textOff="Off"

而不是

android:text="On"

在开关中。

如果有帮助,您也可以通过this。

【讨论】:

是的,我同时使用了android:textOnandroid:textOff,我得到了两个文本,但问题是,它只显示一个文本,而另一个文本同时消失。我想同时显示两者文本是否打开或关闭。因此用户可以看到其他可用选项。 检查该链接。在这种情况下可能会有所帮助。 @MayurRaval【参考方案2】:

这是一个完整的、有效的解决方案,经过有趣的一天实施。

使用以下内容设置开关轨道的可绘制对象。轨道是拇指在其中左右滑动的容器。

mMessengerSwitch.setTrackDrawable(new SwitchTrackTextDrawable(this,
        "LEFT", "RIGHT"));

这是SwitchTrackTextDrawable 的实现,它将背景中的文本准确地写入正确的位置(嗯,我只在 Nexus 5 上针对 API 23 测试过它):

/**
 * Drawable that generates the two pieces of text in the track of the switch, one of each
 * side of the positions of the thumb.
 */
public class SwitchTrackTextDrawable extends Drawable 

    private final Context mContext;

    private final String mLeftText;

    private final String mRightText;

    private final Paint mTextPaint;

    public SwitchTrackTextDrawable(@NonNull Context context,
            @StringRes int leftTextId,
            @StringRes int rightTextId) 
        mContext = context;

        // Left text
        mLeftText = context.getString(leftTextId);
        mTextPaint = createTextPaint();

        // Right text
        mRightText = context.getString(rightTextId);
    

    private Paint createTextPaint() 
        Paint textPaint = new Paint();
        //noinspection deprecation
        textPaint.setColor(mContext.getResources().getColor(android.R.color.white));
        textPaint.setAntiAlias(true);
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setTextAlign(Paint.Align.CENTER);
        // Set textSize, typeface, etc, as you wish
        return textPaint;
    

    @Override
    public void draw(Canvas canvas) 
        final Rect textBounds = new Rect();
        mTextPaint.getTextBounds(mRightText, 0, mRightText.length(), textBounds);

        // The baseline for the text: centered, including the height of the text itself
        final int heightBaseline = canvas.getClipBounds().height() / 2 + textBounds.height() / 2;

        // This is one quarter of the full width, to measure the centers of the texts
        final int widthQuarter = canvas.getClipBounds().width() / 4;
        canvas.drawText(mLeftText, 0, mLeftText.length(),
                widthQuarter, heightBaseline,
                mTextPaint);
        canvas.drawText(mRightText, 0, mRightText.length(),
                widthQuarter * 3, heightBaseline,
                mTextPaint);
    

    @Override
    public void setAlpha(int alpha) 
    

    @Override
    public void setColorFilter(ColorFilter cf) 
    

    @Override
    public int getOpacity() 
        return PixelFormat.TRANSLUCENT;
    

【讨论】:

在 KitKat 上试过...没有用。它显示空白屏幕。 @espinchi 您对此有任何更新吗,我正在尝试做同样的事情,如果您对此或其他更好的解决方案有任何更新,请告诉我。 @NikunjSakhrelia:这个drawable只是设置文本。您可以创建一个背景可绘制对象(也许只是在 xml 中,只需创建一个可绘制对象并设置形状和颜色)并像这里指出的那样动态组合它们:***.com/questions/2739971/… @espinchi 您是如何绘制实际图像的? 代码与图像不匹配。它只是在一侧显示文本,而不是两侧【参考方案3】:

我创建了一个自定义布局,其中包含一个线性布局(将用作开关的轨道)在这个布局中我放置了两个文本来模拟轨道“开”/“关”文本,在它之上,它有一个普通的开关,但没有轨道,只有一个带有透明轨道的拇指。

不管怎样,这是代码:

colors.xml

<color name="switch_selected_text_color">#FFFFFF</color>
<color name="switch_regular_text_color">#A8A8A8</color>

settings_switch_color_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/switch_selected_text_color" android:state_checked="true" />
    <item android:color="@color/switch_regular_text_color" />
</selector>

styles.xml

<style name="SwitchTextAppearance" parent="@android:style/TextAppearance.Holo.Small">
    <item name="android:textColor">@color/settings_switch_color_selector</item>
</style>

new_switch.xml - 在自定义视图中使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <LinearLayout
        android:id="@+id/track_layout"
        android:layout_
        android:layout_
        android:background="@drawable/settings_track"
        android:weightSum="1">

        <TextView
            android:id="@+id/left_text"
            android:layout_
            android:layout_
            android:textColor="@color/switch_regular_text_color"
            android:layout_weight="0.5"
            android:gravity="center"
            android:text="OFF" />

        <TextView
            android:id="@+id/right_text"
            android:layout_
            android:layout_
            android:textColor="@color/switch_regular_text_color"
            android:layout_weight="0.5"
            android:gravity="center"
            android:text="ON" />
    </LinearLayout>

    <Switch
        android:layout_
        android:layout_
        android:thumb="@drawable/thumb_selector"
        android:switchTextAppearance="@style/SwitchTextAppearance"
        android:textOn="ON"
        android:textOff="OFF"
        android:checked="true"
        android:showText="true"
        android:track="@android:color/transparent"/>
</RelativeLayout>

这是自定义视图 - 它只是用于扩展自定义视图布局

public class DoubleSidedSwitch extends RelativeLayout 

    private TextView _leftTextView;
    private TextView _rightTextView;
    private Switch   _switch;

    public DoubleSidedSwitch(Context context) 
        super(context);
        init(context);
    

    public DoubleSidedSwitch(Context context, AttributeSet attrs) 
        super(context, attrs);
        init(context);
    

    private void init(Context context) 
        View view = LayoutInflater.from(context).inflate(R.layout.new_switch, this, true);
        initViews(view);
        initListeners();
    

    private void initListeners() 

    

    private void initViews(View view) 

    

【讨论】:

【参考方案4】:

有一个由 2 个标准按钮和一个 LinearLayout 组成。有一堆 xml 文件要导入,但它在所有版本上都能完美运行,而且非常易于使用。检查以下 Github 页面

Custom Switch With 2 Buttons

用法

    将 res/drawable 下的 XML 文件复制到项目的 res/drawable 文件夹中。 将 LinearLayout 从 layout.xml 复制到您的布局文件。 将 values/colors.xml 和 values/dimens 中的值复制到您自己的文件中。 使用以下代码初始化交换机

SekizbitSwitch mySwitch = new SekizbitSwitch(findViewById(R.id.sekizbit_switch));
            mySwitch.setOnChangeListener(new SekizbitSwitch.OnSelectedChangeListener() 
                @Override
                public void OnSelectedChange(SekizbitSwitch sender) 
                    if(sender.getCheckedIndex() ==0 )
                    
    					System.out.println("Left Button Selected");
                    
                    else if(sender.getCheckedIndex() ==1 )
                    
                        System.out.println("Right Button Selected");
                    
                
            );

【讨论】:

【参考方案5】:

在努力寻找合适的解决方案后,我找到了neat little library。我发现它易于使用,并且完美地满足了我的需求。它甚至可以用于显示更多超过 2 个值。

更新:同时这个库已经停止维护,所以你可能想试试one they recommend。

这就是我最终用更多样式使它看起来的方式,比如我在FrameLayout 周围放置了白色边框来包裹它(我需要让它看起来完全像这样,你不需要使用边框)

这是用于此的 xml:

<FrameLayout
            android:layout_
            android:layout_
            android:padding="1dp"
            android:background="@drawable/white_border">

            <belka.us.androidtoggleswitch.widgets.ToggleSwitch
                android:layout_
                android:layout_
                custom:activeBgColor="@color/white"
                custom:activeTextColor="@color/black"
                custom:inactiveBgColor="@color/black"
                custom:inactiveTextColor="@color/white"
                custom:textToggleLeft="left"
                custom:textToggleRight="right"/>
        </FrameLayout>

@drawable/white_border 看起来像这样:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
<stroke android:
    android:color="@color/white" />
<corners
    android:radius="3dp"/>

【讨论】:

感谢您对好的库的建议,但如果您想要这种开关,那么现在已经过时了,然后使用:github.com/llollox/Android-Toggle-Switch,它非常相似并且运行良好。 是的,我注意到了。虽然我用过这个没有问题,但是去维护一个可能是一个聪明的主意。我将编辑我的答案。

以上是关于Android Text 应该出现在 Switch 的两侧的主要内容,如果未能解决你的问题,请参考以下文章

Android 手机卫士--弹出对话框

Android 出现多种问题的解决

Android 出现多种问题的解决

Android Studio 渲染问题

用switch函数根据选择不同的radio出现不同的视图

switch语句