- 浏览: 5819475 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
package com.widget.view; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.RadioButton; /** * 复杂样式的单选框,自定义RadioGroup实现RadioButton多行多列排列布局 * * 1、使用与RadioGroup一样,MutilRadioGroup里的所有RadioButton(包括MutilRadioGroup里嵌套的子布局里面的所有RadioButton)属于同一组。 2、增加方法setCheckWithoutNotification(int id),设置默认的RadioButton被选中,但是不响应监听事件。 * @author https://github.com/pheng/android_radiogroup_MutilRadioGroup * */ public class MutilRadioGroup extends LinearLayout { // holds the checked id; the selection is empty by default private int mCheckedId = -1; // tracks children radio buttons checked state private CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener; // when true, mOnCheckedChangeListener discards events private boolean mProtectFromCheckedChange = false; private OnCheckedChangeListener mOnCheckedChangeListener; private PassThroughHierarchyChangeListener mPassThroughListener; /** * {@inheritDoc} */ public MutilRadioGroup(Context context) { super(context); setOrientation(VERTICAL); init(); } /** * {@inheritDoc} */ public MutilRadioGroup(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mChildOnCheckedChangeListener = new CheckedStateTracker(); mPassThroughListener = new PassThroughHierarchyChangeListener(); super.setOnHierarchyChangeListener(mPassThroughListener); } /** * {@inheritDoc} */ @Override public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { // the user listener is delegated to our pass-through listener mPassThroughListener.mOnHierarchyChangeListener = listener; } /** * set the default checked radio button, without notification the listeners * @param mCheckedId the default checked radio button's id, if none use -1 */ public void setCheckWithoutNotification(int id){ if (id != -1 && (id == mCheckedId)) { return; } mProtectFromCheckedChange = true; if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } if (id != -1) { mProtectFromCheckedChange = true; } mProtectFromCheckedChange = false; mCheckedId = id; } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { List<RadioButton> btns = getAllRadioButton(child); if(btns != null && btns.size() > 0){ for(RadioButton button : btns){ if (button.isChecked()) { mProtectFromCheckedChange = true; if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } mProtectFromCheckedChange = false; setCheckedId(button.getId()); } } } super.addView(child, index, params); } /** * get all radio buttons which are in the view * @param child */ private List<RadioButton> getAllRadioButton(View child){ List<RadioButton> btns = new ArrayList<RadioButton>(); if (child instanceof RadioButton) { btns.add((RadioButton) child); }else if(child instanceof ViewGroup){ int counts = ((ViewGroup) child).getChildCount(); for(int i = 0; i < counts; i++){ btns.addAll(getAllRadioButton(((ViewGroup) child).getChildAt(i))); } } return btns; } /** * <p>Sets the selection to the radio button whose identifier is passed in * parameter. Using -1 as the selection identifier clears the selection; * such an operation is equivalent to invoking {@link #clearCheck()}.</p> * * @param id the unique id of the radio button to select in this group * * @see #getCheckedRadioButtonId() * @see #clearCheck() */ public void check(int id) { // don't even bother if (id != -1 && (id == mCheckedId)) { return; } if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } if (id != -1) { setCheckedStateForView(id, true); } setCheckedId(id); } private void setCheckedId(int id) { mCheckedId = id; if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId); } } private void setCheckedStateForView(int viewId, boolean checked) { View checkedView = findViewById(viewId); if (checkedView != null && checkedView instanceof RadioButton) { ((RadioButton) checkedView).setChecked(checked); } } /** * <p>Returns the identifier of the selected radio button in this group. * Upon empty selection, the returned value is -1.</p> * * @return the unique id of the selected radio button in this group * * @see #check(int) * @see #clearCheck() * * @attr ref android.R.styleable#MyRadioGroup_checkedButton */ public int getCheckedRadioButtonId() { return mCheckedId; } /** * <p>Clears the selection. When the selection is cleared, no radio button * in this group is selected and {@link #getCheckedRadioButtonId()} returns * null.</p> * * @see #check(int) * @see #getCheckedRadioButtonId() */ public void clearCheck() { check(-1); } /** * <p>Register a callback to be invoked when the checked radio button * changes in this group.</p> * * @param listener the callback to call on checked state change */ public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { mOnCheckedChangeListener = listener; } /** * {@inheritDoc} */ @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new MutilRadioGroup.LayoutParams(getContext(), attrs); } /** * {@inheritDoc} */ @Override protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { return p instanceof MutilRadioGroup.LayoutParams; } @Override protected LinearLayout.LayoutParams generateDefaultLayoutParams() { return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(MutilRadioGroup.class.getName()); } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(MutilRadioGroup.class.getName()); } /** * <p>This set of layout parameters defaults the width and the height of * the children to {@link #WRAP_CONTENT} when they are not specified in the * XML file. Otherwise, this class ussed the value read from the XML file.</p> * * <p>See * {@link android.R.styleable#LinearLayout_Layout LinearLayout Attributes} * for a list of all child view attributes that this class supports.</p> * */ public static class LayoutParams extends LinearLayout.LayoutParams { /** * {@inheritDoc} */ public LayoutParams(Context c, AttributeSet attrs) { super(c, attrs); } /** * {@inheritDoc} */ public LayoutParams(int w, int h) { super(w, h); } /** * {@inheritDoc} */ public LayoutParams(int w, int h, float initWeight) { super(w, h, initWeight); } /** * {@inheritDoc} */ public LayoutParams(ViewGroup.LayoutParams p) { super(p); } /** * {@inheritDoc} */ public LayoutParams(MarginLayoutParams source) { super(source); } /** * <p>Fixes the child's width to * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and the child's * height to {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} * when not specified in the XML file.</p> * * @param a the styled attributes set * @param widthAttr the width attribute to fetch * @param heightAttr the height attribute to fetch */ @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; } } } /** * <p>Interface definition for a callback to be invoked when the checked * radio button changed in this group.</p> */ public interface OnCheckedChangeListener { /** * <p>Called when the checked radio button has changed. When the * selection is cleared, checkedId is -1.</p> * * @param group the group in which the checked radio button has changed * @param checkedId the unique identifier of the newly checked radio button */ public void onCheckedChanged(MutilRadioGroup group, int checkedId); } private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // prevents from infinite recursion if (mProtectFromCheckedChange) { return; } mProtectFromCheckedChange = true; if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } mProtectFromCheckedChange = false; int id = buttonView.getId(); setCheckedId(id); } } /** * <p>A pass-through listener acts upon the events and dispatches them * to another listener. This allows the table layout to set its own internal * hierarchy change listener without preventing the user to setup his.</p> */ private class PassThroughHierarchyChangeListener implements ViewGroup.OnHierarchyChangeListener { private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener; /** * {@inheritDoc} */ @SuppressLint("NewApi") public void onChildViewAdded(View parent, View child) { if (parent == MutilRadioGroup.this ) { List<RadioButton> btns = getAllRadioButton(child); if(btns != null && btns.size() > 0){ for(RadioButton btn : btns){ int id = btn.getId(); // generates an id if it's missing if (id == View.NO_ID && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { id = View.generateViewId(); btn.setId(id); } btn.setOnCheckedChangeListener( mChildOnCheckedChangeListener); } } } if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewAdded(parent, child); } } /** * {@inheritDoc} */ public void onChildViewRemoved(View parent, View child) { if (parent == MutilRadioGroup.this) { List<RadioButton> btns = getAllRadioButton(child); if(btns != null && btns.size() > 0){ for(RadioButton btn : btns){ btn.setOnCheckedChangeListener(null); } } } if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewRemoved(parent, child); } } } }
CircleCheckBox
https://github.com/CoXier/CheckBox
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 6993网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10367一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2622算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2848在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61751.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 978先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1354有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2220用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2594纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2565Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
对视图的对角线切割DiagonalView
2016-12-27 14:23 1118提供对视图的对角线切割,具有很好的用户定制 基本用法 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3494比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1707基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1920可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2178ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3415先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3733按比例放大图片,不拉伸失真 import android. ...
相关推荐
在本场景中,我们讨论的主题是如何利用`RadioButton`在布局中实现多行多列的单选效果。这个功能在创建例如设置界面、问卷调查或者选项列表时非常常见。 `RadioButton`属于`RadioGroup`的一部分,`RadioGroup`是一个...
总结一下,`RadioGroup` 支持 `RadioButton` 的多行多列布局,通过设置不同的布局组件和属性,我们可以自由地调整 `RadioButton` 的排列方式。同时,通过设置 `OnCheckedChangeListener`,我们可以轻松获取用户在 `...
1. **多行多列布局**:原生RadioGroup默认将RadioButton垂直排列,`Multi_RadioGroup_Plus`允许开发者自定义行数和列数,使得RadioButtons可以按照指定的行列数量进行排列。 2. **自动换行**:当RadioButtons超出当...
4. **布局管理**:为了让单选框按照多行多列的方式排列,我们需要编写逻辑来计算每个单选框的位置。这可能涉及到计算网格的宽度和高度,以及每个单元格的位置。 5. **数据绑定**:如果项目中存在数据驱动的需求,...
本教程将详细介绍如何在Android应用中实现一个多行多列的`RadioGroup`,以提供更加灵活和美观的用户界面。 首先,我们需要了解`RadioGroup`的基本用法。`RadioGroup`继承自`LinearLayout`,所以它可以按垂直或水平...
每个 RadioGroup 可以容纳多个 RadioButton,通过设置 RadioGroup 的 orientation 属性,可以实现水平或竖直方向上的排列。然后,我们可以将多个 RadioGroup 组合起来,实现多行排列的效果。 下面是实现多行排列的...
这个组件允许开发者将RadioButton组织成多行多列的布局,以适应不同屏幕尺寸和复杂的用户交互需求。 一、RadioGroup的基本使用 1. 添加到布局文件:在XML布局文件中,可以通过添加标签来创建一个RadioGroup。例如...
在这个自定义类中,我们可以覆盖`onLayout`方法来处理子项的布局,实现多行多列的排列。同时,我们需要维护一个内部数据结构,如二维数组或列表,用于存储每个`RadioButton`的位置信息,以便于在选中事件中正确更新...
总之,重构`RadioGroup`以实现多行多列的`RadioButton`展示,是一个挑战性的任务,它涉及到对Android布局系统深入的理解。通过自定义布局,我们可以实现更复杂的界面设计,提高用户体验。在实际开发中,这种定制化的...
4. **网格布局(GridLayout)**:将元素均匀分布到多行多列中,适合展示列表或卡片。 5. **约束布局(ConstraintLayout)**:Google推出的最新布局,通过约束实现元素之间的相对位置,可以替代相对布局,提供更高效...
这个布局在创建多列或者需要按行排列元素的界面时非常实用,比如在创建一个选项列表或者展示一些标签时。`FlowLayout.rar`可能包含了一个示例项目,帮助开发者快速理解和使用这种布局。 `FlowLayout`与Android默认...
`FlowLayoutPanel`按照特定的方向(水平或垂直)自动排列控件,而`TableLayoutPanel`则使用表格样式布局,支持多行多列的控件排列。 此外,WinForm还支持事件驱动编程模型,这意味着当用户与控件交互时(如点击按钮...
4. **ConstraintLayout**:更为灵活的布局管理器,可以通过设置约束条件来控制各个元素的位置,实现复杂布局,包括单选按钮的多行显示。 5. **动态添加RadioButton**:如果数量不确定或需要动态调整,可以编程方式...
列表视图(ListView)和网格视图(GridView)用于展示多行多列的数据,通常结合Adapter使用,自定义每行或每列的视图。滚动视图(ScrollView)可容纳多个视图,并允许用户上下滚动查看。 日期/时间选择器(DatePicker/...
- **GridView**:网格布局,显示多行多列的元素。 - **TabLayout**:标签页,用于分隔内容。 - **SwipeRefreshLayout**:滑动刷新布局,常见于新闻列表,下拉刷新内容。 3. **自定义控件**: - 开发者可以根据...
11. GridView:网格布局,可展示多行多列的数据。 12. WebView:内置浏览器组件,用于加载网页内容。 二、界面跳转 在Android应用中,界面间的跳转是通过Intent实现的。Intent是一个对象,用于表示应用程序中的一...
- `TableLayout`:类似表格的布局,适合多行多列展示数据。 3. **自定义控件**: - 开发者可以根据需求自定义控件,通过继承现有控件并覆盖相关方法。 - 自定义绘图逻辑,使用`onDraw()`方法。 - 处理触摸事件...
- **网格布局GridLayout**:类似于HTML中的表格布局,但是更为灵活,控件可以跨越多行多列。 ### Android Studio视图工具箱 - **View组件的使用**:Android Studio提供了丰富的视图组件,如文本框(TextView)、...
RadioButton 则用于单选,同一组内的多个 RadioButton 只能有一个被选中。这两种控件常用于设置界面,让用户在多个选项中做出选择。 5.2.4 SpinnerSpinner 是下拉列表控件,用于在有限的选项中选择一项。用户点击 ...
4. GridLayout:类似表格,将视图按行和列进行布局。 5. ConstraintLayout:是最灵活的布局,通过约束条件确定视图的位置,可实现复杂的界面设计。 三、动态创建UI 除了XML布局外,还可以通过Java代码动态创建和...