gpt4 book ai didi

android - 使用多个 RadioButton(自定义 RadioGroup)创建 android RadioGroup

转载 作者:行者123 更新时间:2023-11-29 15:06:47 28 4
gpt4 key购买 nike

我想实现如下图所示的Single RadioGroup 以进行血型选择。如何做到这一点?

enter image description here

最佳答案

我创建了自己的 RadioGridLayout,其中包含 RadioGroup 代码并扩展了 GridLayout。您可以复制此代码。对我来说工作得很好。在您可以在 xml 中使用此布局并自定义网格布局后。

对于 R.styleable.RadioGridLayout_checked 我使用了这样的代码:

<resources>
<declare-styleable name="RadioGridLayout">
<attr name="checked" format="integer" />
</declare-styleable>
</resources>
public class RadioGridLayout extends GridLayout {

private int mCheckedId = -1;
private CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener;
private boolean mProtectFromCheckedChange = false;
private OnCheckedChangeListener mOnCheckedChangeListener;
private PassThroughHierarchyChangeListener mPassThroughListener;

private void setCheckedId(@IdRes int id) {
mCheckedId = id;
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
}
AutofillManager afm = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
afm = getContext().getSystemService(AutofillManager.class);
}
if (afm != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
afm.notifyValueChanged(this);
}
}
}

public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}

public interface OnCheckedChangeListener {
void onCheckedChanged(RadioGridLayout group, @IdRes int checkedId);
}

private int mInitialCheckedId = View.NO_ID;

public RadioGridLayout(Context context) {
super(context);
setOrientation(VERTICAL);
init();
}

public RadioGridLayout(Context context, AttributeSet attrs) {
super(context, attrs);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) {
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
}
}

TypedArray attributes = context.obtainStyledAttributes(
attrs,
R.styleable.RadioGridLayout,
R.attr.radioButtonStyle, 0);

int value = attributes.getResourceId(R.styleable.RadioGridLayout_checked, View.NO_ID);
if (value != View.NO_ID) {
mCheckedId = value;
mInitialCheckedId = value;
}

attributes.recycle();
init();
}

private void init() {
mChildOnCheckedChangeListener = new CheckedStateTracker();
mPassThroughListener = new PassThroughHierarchyChangeListener();
super.setOnHierarchyChangeListener(mPassThroughListener);
}

@Override
public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) {
mPassThroughListener.mOnHierarchyChangeListener = listener;
}

@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (mCheckedId != -1) {
mProtectFromCheckedChange = true;
setCheckedStateForView(mCheckedId, true);
mProtectFromCheckedChange = false;
setCheckedId(mCheckedId);
}
}

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if (child instanceof RadioButton) {
final RadioButton button = (RadioButton) child;
if (button.isChecked()) {
mProtectFromCheckedChange = true;
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
mProtectFromCheckedChange = false;
setCheckedId(button.getId());
}
}

super.addView(child, index, params);
}

public void check(@IdRes int id) {
if (id != -1 && (id == mCheckedId)) {
return;
}

if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}

if (id != -1) {
setCheckedStateForView(id, true);
}

setCheckedId(id);
}

private void setCheckedStateForView(int viewId, boolean checked) {
View checkedView = findViewById(viewId);
if (checkedView != null && checkedView instanceof RadioButton) {
((RadioButton) checkedView).setChecked(checked);
}
}

@IdRes
public int getCheckedRadioButtonId() {
return mCheckedId;
}

public void clearCheck() {
check(-1);
}

@Override
public GridLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
return new GridLayout.LayoutParams(getContext(), attrs);
}

@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof RadioGroup.LayoutParams;
}

@Override
protected GridLayout.LayoutParams generateDefaultLayoutParams() {
return new LayoutParams();
}

@Override
public CharSequence getAccessibilityClassName() {
return RadioGroup.class.getName();
}

public static class LayoutParams extends GridLayout.LayoutParams {

public LayoutParams(Spec rowSpec, Spec columnSpec) {
super(rowSpec, columnSpec);
}

public LayoutParams() {
super();
}

public LayoutParams(ViewGroup.LayoutParams params) {
super(params);
}

public LayoutParams(MarginLayoutParams params) {
super(params);
}

public LayoutParams(GridLayout.LayoutParams source) {
super(source);
}

public LayoutParams(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void setBaseAttributes(TypedArray a,
int widthAttr, int heightAttr) {

if (a.hasValue(widthAttr)) {
width = a.getLayoutDimension(widthAttr, "layout_width");
} else {
width = WRAP_CONTENT;
}

if (a.hasValue(heightAttr)) {
height = a.getLayoutDimension(heightAttr, "layout_height");
} else {
height = WRAP_CONTENT;
}
}
}

private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mProtectFromCheckedChange) {
return;
}

mProtectFromCheckedChange = true;
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
mProtectFromCheckedChange = false;

int id = buttonView.getId();
setCheckedId(id);
}
}

private class PassThroughHierarchyChangeListener implements
ViewGroup.OnHierarchyChangeListener {
private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener;

@Override
public void onChildViewAdded(View parent, View child) {
if (parent == RadioGridLayout.this && child instanceof RadioButton) {
int id = child.getId();
if (id == View.NO_ID) {
id = View.generateViewId();
child.setId(id);
}
((RadioButton) child).setOnCheckedChangeListener(
mChildOnCheckedChangeListener);
}

if (mOnHierarchyChangeListener != null) {
mOnHierarchyChangeListener.onChildViewAdded(parent, child);
}
}

@Override
public void onChildViewRemoved(View parent, View child) {
if (parent == RadioGridLayout.this && child instanceof RadioButton) {
((RadioButton) child).setOnCheckedChangeListener(null);
}

if (mOnHierarchyChangeListener != null) {
mOnHierarchyChangeListener.onChildViewRemoved(parent, child);
}
}
}

@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
super.onProvideAutofillStructure(structure, flags);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
structure.setDataIsSensitive(mCheckedId != mInitialCheckedId);
}
}

@Override
public void autofill(AutofillValue value) {
if (!isEnabled()) return;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (!value.isList()) {
Timber.w(value + " could not be autofilled into " + this);
return;
}
}

int index = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
index = value.getListValue();
}
final View child = getChildAt(index);
if (child == null) {
Timber.w("RadioGroup.autoFill(): no child with index %s", index);
return;
}

check(child.getId());
}

@Override
public int getAutofillType() {
return isEnabled() ? AUTOFILL_TYPE_LIST : AUTOFILL_TYPE_NONE;
}

@Override
public AutofillValue getAutofillValue() {
if (!isEnabled()) return null;

final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getId() == mCheckedId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return AutofillValue.forList(i);
}
}
}
return null;
}
}

关于android - 使用多个 RadioButton(自定义 RadioGroup)创建 android RadioGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501541/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com