android编程多组件布局,Android把多个控件定义成一个整体的布局类使用
在程序中有时候几个控件要放在一起,想随意放在布局上,而且不仅一个布局要使用,此时就想把这几个控件定义成一个新的View就好了,于是就有了下面这个类新的控件类SeekBarGroup.java,SeekBarGroup.java集成了三个View,有两个TextView,一个SeekBar,就是一个显示时间的进度条,这只是一种应用思想,可以是任何View的集合
下面先看下效果,就是一个普通的进度条加两个文本显示,
关键代码
package com.adayome.bddemo.widgets;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.adayome.bddemo.R;
import com.adayome.bddemo.utils.LogUtils;
public class SeekBarGroup extends RelativeLayout {
private static final int tv_start_id = 0x1111111;
private static final int tv_end_id = 0x1111112;
private static final int sb_time_id = 0x1111113;
private SeekBar sbTime;
private TextView tvStart;
private TextView tvEnd;
// 布局参数设置
private RelativeLayout.LayoutParams tvStartLp, tvEndLp, sbTimeLp;
public SeekBarGroup(Context context, AttributeSet attrs) {
super(context, attrs);
setGravity(Gravity.CENTER);
initView(context);
// 用代码直接向布局中添加控件
addView(tvStart, tvStartLp);
addView(tvEnd, tvEndLp);
addView(sbTime, sbTimeLp);
}
private void initView(Context context) {
tvStart = new TextView(context);
tvEnd = new TextView(context);
// 设置每一个控件的布局参数
tvStartLp = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tvEndLp = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tvStart.setId(tv_start_id);
tvStart.setText("start");
tvEnd.setId(tv_end_id);
tvEnd.setText("end");
// 往布局参数中添加属性
tvStartLp
.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
tvStartLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
tvEndLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
tvEndLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
initSeekBar(context);
LogUtils.i("-----initView");
}
private void initSeekBar(Context context) {
sbTime = new SeekBar(context);
sbTimeLp = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
sbTimeLp.addRule(RelativeLayout.LEFT_OF, tv_end_id);
sbTimeLp.addRule(RelativeLayout.RIGHT_OF, tv_start_id);
sbTimeLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
sbTime.setId(sb_time_id);
sbTime.setMax(100);
sbTime.setProgress(30);
Drawable d = context.getResources().getDrawable(
R.drawable.seekbar_style);
sbTime.setProgressDrawable(d);
Drawable thumb = context.getResources().getDrawable(
R.drawable.seek_thumb_pic);
sbTime.setThumb(thumb);
sbTime.setPadding(15, 0, 15, 0);
sbTime.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
setStart(String.valueOf(progress));
LogUtils.i("onProgressChanged pro = " + progress);
}
});
}
public void setStart(String start) {
tvStart.setText(start);
}
public void setEnd(String end) {
tvEnd.setText(end);
}
public void setProgress(int progress) {
sbTime.setProgress(progress);
}
public int getMax() {
return sbTime.getMax();
}
public interface SeekBarGroupListener {
public void setStart(String start);
public void setEnd(String start);
public void onProgressChanged(int progress, boolean fromUser);
}
}主要跟平常的控件一样使用就可以了,在布局中的定义
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@+id/tv_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试2" />
android:id="@+id/seekbar_group"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
调用方法
package com.adayome.bddemo;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import com.adayome.bddemo.widgets.SeekBarGroup;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class Fragment2 extends BaseFragment implements OnClickListener {
private static final String TAG = "Fragment2";
private Random mRan = new Random();
private SeekBarGroup group;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_2, container, false);
return initWidgets(v);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
group.setProgress(mRan.nextInt(100));
}
super.handleMessage(msg);
};
};
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
// 需要做的事:发送消息
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
private View initWidgets(View v) {
group = (SeekBarGroup) v.findViewById(R.id.seekbar_group);
group.setEnd(String.valueOf(group.getMax()));
return v;
}
}
android编程多组件布局,Android把多个控件定义成一个整体的布局类使用相关推荐
- android程序设计排序方法,Android编程之可以实现拖动排序的listview控件
DragSortListView是一个可以实现拖动排序的listview控件,是我看到的交互较为复杂的开源代码中不管是代码质量还是流畅性都最好的. DragSortListView 简称DSLV,继承 ...
- android 组件大小,Android编程获取组件尺寸大小的方法
本文实例讲述了Android编程获取组件尺寸大小的方法.分享给大家供大家参考,具体如下: 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽 ...
- 【android编程】 第三讲-Android布局管理器
android编程 第三讲 Android布局管理器 文章目录 android编程 第三讲 Android布局管理器 约束布局管理器ConstraintLayout 线性布局管理器LinearLayo ...
- Android开发的之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Android 在布局容器中动态添加控件
这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...
- android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
很久没有写博客了,今天给大家分享一个刚写好的小功能,很实用. 使用场景:禁用布局里所有的子控件,让界面只能看,但不能编辑,如果一个一个控件去设置肯定是很麻烦的,于是想了个好方法.可根据需要扩展更多控件 ...
- Android开发 入门篇(二) - 常用UI控件
文章目录 控件 Button TextView EditText ImageView ProgressBar AlertDialog ProgressDialog 布局 LenearLayout an ...
- Android之RemoteViews篇上————通知栏和桌面小控件
Android之RemoteViews篇上----通知栏和桌面小控件 一.目录 文章目录 Android之RemoteViews篇上----通知栏和桌面小控件 一.目录 二.RemoteViews的概 ...
- Android获取景点的信息,景点介绍(ListView控件应用)
1. 案例概述 此案例主要是对ListView列表控件的使用.当应用中包含多项数据,每项数据结构相同,只是内容不同时,可通过列表显示.对于列表中的内容,可以是显示字符串的TextView,也可以是结构 ...
最新文章
- centos 修改shm
- CSM+3PAR帮助XXX教育技术中心
- 成功解决你没有权限访问,请与网络管理员联系图文教程
- OpenGL从入门到精通--纹理
- 试题 历届试题 买不到的数目(dp/数学)
- 判断一个Checkbox是否被选中
- java学习(178):终篇?静态代理?动态代理?
- 高级程序员如何面对职场压力?(2)--受伤的总是我
- 升级 ubuntu_Ubuntu 19.04 已经到期!现有用户必须升级到 Ubuntu 19.10
- linux 显示文件多少行
- 7.边缘检测:2D运算——回顾、高斯滤波器2D的导数、Sigma对导数的影响_1
- Collections.sort的两种用法
- 统计学习方法--提升方法adaBoost算法(集成学习)
- linux 下的emoji在MariaDB中的字符集修改
- linux错误—1.vim: command not found
- 阿里免费开放一切AI算力的背后是什么?
- Word 中自动设置匹配章、节序号的标题
- 关于PCDet 训练中的 road plane问题
- 对接支付宝 生成付款码功能
- SHIMANO各个等级配件的区别
热门文章
- GZNT模版文件说明
- 2008 读第一本书
- 与访问您网站(或Blog)的朋友即时交流
- java 1.8环境变量_java1.8安装及环境变量配置教程
- 并查集——亲戚(洛谷 P1551)
- undolog 是binlog_mysql日志redo log、undo log、binlog以及作用看这篇就可以啦
- 数据3分钟丨Oracle Database 21c终于发布而22c可能直接跳过;2021 OceanBase数据库大赛开启。...
- 当SQL Server爱上Linux:AVAILABILITY_MODE 和 DataGuard 的实践差距
- 如何将外链接向内连接转换?
- SimpleDateFormat类的线程安全问题和解决方案