API 8のサポートにカスタムスイッチを使用しています [〜#〜] this [〜#〜] カスタムスイッチのライブラリを使用しています。でも、図のようなものを作りたいです。スタイルの色を変えてみましたが、思い通りに色が出ません。
助けてください、よろしくお願いします。
これを実装して楽しい一日を過ごした後の、完全で実用的なソリューションを次に示します。
以下を使用して、スイッチのトラックのドローアブルを設定します。トラックは、親指が左右にスライドするコンテナです。
mMessengerSwitch.setTrackDrawable(new SwitchTrackTextDrawable(this,
"LEFT", "RIGHT"));
SwitchTrackTextDrawable
の実装は次のとおりです。これは、テキストをバックグラウンドで正確に正しい位置に書き込みます(まあ、私はNexus5のAPI23でのみテストしました)。
/**
* 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;
}
}
使ってみてください
Android:textOn="On"
Android:textOff="Off"
の代わりに
Android:text="On"
スイッチで。
それが助けになるなら、 this を通過することもできます。
これに対する正しい解決策を見つけるのに苦労した後、私はこれを見つけました 小さな図書館 。使いやすく、ニーズを完全に満たしていました。 2つ以上の値を表示するために使用することもできます。
[〜#〜] update [〜#〜] :その間、このライブラリは維持されなくなったので、 推奨されるもの を試してみてください。 。
これは、私がそれを包むFrameLayout
の周りに置いた白い境界線のようないくつかのより多くのスタイリングで最終的にそれをどのように見せたかですボーダーを使用しない):
これのxmlは次のとおりです。
<FrameLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="1dp"
Android:background="@drawable/white_border">
<belka.us.androidtoggleswitch.widgets.ToggleSwitch
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
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:width="2dip"
Android:color="@color/white" />
<corners
Android:radius="3dp"/>
このレイアウトで線形レイアウト(スイッチのトラックとして使用されます)を含むカスタムレイアウトを作成しました。トラックの「オン」/「オフ」テキストをシミュレートするために2つのテキストを配置し、その上に通常のスイッチですが、トラックはなく、透明なトラックのある親指だけです。
とにかくこれはコードです:
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_width="wrap_content"
Android:layout_height="wrap_content">
<LinearLayout
Android:id="@+id/track_layout"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/settings_track"
Android:weightSum="1">
<TextView
Android:id="@+id/left_text"
Android:layout_width="0dp"
Android:layout_height="match_parent"
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_width="0dp"
Android:layout_height="match_parent"
Android:textColor="@color/switch_regular_text_color"
Android:layout_weight="0.5"
Android:gravity="center"
Android:text="ON" />
</LinearLayout>
<Switch
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
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) {
}
}
2つの標準ボタンとLinearLayoutで作成されたものがあります。インポートするxmlファイルはたくさんありますが、すべてのバージョンで完全に機能し、非常に使いやすいです。次のGithubページを確認してください
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");
}
}
});