Android编程常用技巧实例总结
作者:段残梦 发布时间:2022-11-30 20:27:44
本文实例讲述了Android编程常用技巧。分享给大家供大家参考,具体如下:
1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误
在res下准备一个anim文件夹,里面包含两个文件,main_login_shake.xml 和 main_login_cycle_7.xml,
其中,main_login_shake.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="10"
android:duration="1000"
android:interpolator="@anim/main_login_cycle_7" />
上面文件中引用了main_login_cycle_7.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" />
这两段代码的意思就是在1秒钟之类,x坐标从0到10晃动7次
看java代码:
shakeanim = AnimationUtils.loadAnimation(this,R.anim.main_login_shake);
btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean ready = true;
String username=et_username.getText().toString();
String password=et_password.getText().toString();
if (!username.matches("^\\w{1,}+$")) {
ready = false;
et_username.startAnimation(shakeanim);
}
if (!password.matches("^\\w{1,}+$")) {
ready = false;
et_password.startAnimation(shakeanim);
}
if(selectClinic==null){
ready = false;
et_clinic.startAnimation(shakeanim);
}
if (ready) {
loginStart(username,password,Long.parseLong(selectClinic.get("id").toString()),Integer.parseInt(selectClinic.get("type_id").toString()));
}
}
});
2. 当一个Activity中很多地方需要使用到对话框,可以如下操作:
showDialog(R.id.wait_edit_arriveltime);
showDialog(R.id.wait_edit_yuyuedata);
showDialog(R.id.wait_edit_close);
......
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case R.id.wait_edit_yuyuedata:
DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker,int year, int month, int dayOfMonth) {
wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
}
};
dialog = new DatePickerDialog(this, dateListener, Integer.parseInt(app.getAppointedDate().split("/")[2]), Integer.parseInt(app.getAppointedDate().split("/")[1]), Integer.parseInt(app.getAppointedDate().split("/")[0]));
break;
case R.id.wait_edit_arriveltime:
TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
wait_edit_arriveltime.setText(hourOfDay+":"+minute);
}
};
dialog = new TimePickerDialog(this, timeListener, Integer.parseInt(app.getEstimateArriveTime().split(":")[0]), Integer.parseInt(app.getEstimateArriveTime().split(":")[1]), true);
break;
case R.id.wait_edit_close:
AlertDialog.Builder builder = new AlertDialog.Builder(EditWaitActivity.this);
builder.setTitle("您要确定放弃编辑吗?");
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
EditWaitActivity.this.finish();
}});
builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int whichButton) {
}
});
builder.show();
break;
default:
break;
}
return dialog;
}
3. 标准的adapter的格式,以后就按照这样的形式写
public class MyAdapter extends BaseAdapter{
Context context;
PageRecord<Appointment> data;
private ViewHolder tempHolder;
private View tempView;
public MyAdapter(Context context,PageRecord<Appointment> data){
this.context = context;
this.data = data;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
Appointment app = data.getResultSet().get(position);
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
holder=new ViewHolder(convertView);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
tempHolder = holder;
tempView = convertView;
holder.setData(app);
return convertView;
}
public long getItemId(int position) {
return position;
}
public Object getItem(int position) {
return data.getResultSet().get(position);
}
public int getCount() {
return data.getResultSet()==null?0:data.getResultSet().size();
}
public void setData(PageRecord<Appointment> data){
this.data = data;
this.notifyDataSetChanged();
tempView.invalidate();
}
/**
* 重新绘制
* @param app
*/
public void redraw(Appointment app){
tempHolder.timeView.setText(app.getAppointedDate()+" "+app.getEstimateArriveTime());
tempHolder.nameView.setText(app.getPatient().getNameEN());
tempHolder.doctorView.setText(app.getMo().getNameEN());
tempView.invalidate();
}
private class ViewHolder{
private TextView timeView;
private TextView nameView;
private TextView doctorView;
public ViewHolder(View convertView){
timeView = (TextView) convertView.findViewById(R.id.yuyuetime);
nameView = (TextView) convertView.findViewById(R.id.yuyuename);
doctorView = (TextView) convertView.findViewById(R.id.doctorname);
}
public void setData(Appointment app){
timeView.setText(app.getAppointedDate()+" "+app.getEstimateArriveTime());
nameView.setText(app.getPatient().getNameEN());
doctorView.setText(app.getMo().getNameEN());
}
}
}
4. 获取屏幕分辨率的两种方法
// 方法1 Android获得屏幕的宽和高
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
// 方法2
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float width=dm.widthPixels*dm.density;
float height=dm.heightPixels*dm.density;
打印结果:width:320.0,height:480.0,screenWidth:320,screenHeight:480
dpi值的是屏幕上每英寸的像素点。如果一个160dpi的屏幕,1dp=1px。假如我现在有一个480*800,160dp的屏,那么他的实际面积要比480*800,240dp的屏面积大,但是清晰度却不如后面这个屏。
如果有些实体手机在做测试的时候发现得到的分辨率比实际的分辨率小很多,那么这里得到的是dp单位的像素值,可以通过dp的密度值来转换,如下:
480*800的手机(WVGA)density=240。
转换公式如下:
pixs =dips * (density/160)
dips=(pixs*160)/density
480*800单位是px。而320*533单位是dp
5,资源的一些应用
* 不同的layout
Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
* hdpi、mdpi、ldpi
前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
* drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。
* 屏幕方向
横屏竖屏自动切换
可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。
* 禁用自动切换
只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制。
Android:screenOrientation="landscape" //是限制此页面横屏显示
Android:screenOrientation="portrait" //是限制此页面数竖屏显示
* 字体自适应大小
方法1:
首先根据不同分辨率获取不同字体大小。
在RES里创建
values-480x320/strings.xml 里面设置<dimen name="Text_size">30px</dimen>
和
values-800x400/strings.xml 里面设置<dimen name="Text_size">40px</dimen>
分别代表480X320 和 800X400分辨率情况下 字号为30px和40px;
在java文件中这样调用
int sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);
方法2:
在视图的 onsizechanged里获取视图宽度,一般情况下默认宽度是320,所以计算一个缩放比率rate = (float) w/320 w是实际宽度
然后在设置字体尺寸时 paint.setTextSize((int)(8*rate)); 8是在分辨率宽为320 下需要设置的字体大小实际字体大小 = 默认字体大小 x rate
希望本文所述对大家Android程序设计有所帮助。
猜你喜欢
- 前文传送门:Netty分布式Future与Promise执行回调相关逻辑剖析概述FastThreadLocal我们在剖析堆外内存分配的时候简
- Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Myba
- 关于[Cannot determine value type from string ‘xxx’]的
- 前段时间学习JDBC,要连接mysql获取数据。按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友
- 介绍1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙。由蓝牙技术联盟(Bluetooth SI
- 在Java中,可以通过Runtime类或ProcessBuilder类来实现调用外部程序。Runtime类与ProcessBuilder类使
- 一、引言之前小编讲了MP从入门到核心功能的使用,接下来这几天小编会把MP在实际项目中,一些常用的高级功能给记录一下。高级功能分为:逻辑删除、
- 首先来看一下工具StringUtils的判断方法:一种是org.apache.commons.lang3包下的;另一种是org.spring
- 1.冒泡排序简介冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的
- Commons Beanutils是Apache开源组
- 骑士周游问题在8x8的国际棋盘上,按照马走日的规则,验证是否能够走遍棋盘。解题思路1、创建棋盘 chessBoard,是一个二维数组。2、将
- 提示:java.util.zipoutputstream
- 本文实例展示了Activiti流程图查看的实现方法,具体步骤如下所示:1、测试用例查看图片代码如下:public void viewImag
- 本文实例讲述了C#警惕匿名方法造成的变量共享。分享给大家供大家参考,具体如下:匿名方法匿名方法是.NET 2.0中引入的高级特性,“匿名”二
- 本文实例讲述了Android实现ListView异步加载的方法。分享给大家供大家参考,具体如下:@Override publi
- 前言本文主要给大家介绍了关于C#基础之Attribute和反射的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。A
- Java中IO的模型分为三种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。BIO【同步阻塞】在JDK1.4出来之前,我们建立网
- 修改方法有两个1.方法1:点“编辑”-->“列选择模式”2.方法2:快捷键Shift+Alt+Insert修改后结果如下:来源:htt
- spring boot ${}占位符不起作用问题:在 pom.xml 文件里定义好属性标签,然后在 properties或者xml 中使用$
- 用DataFormatString格式化GridView在 GridView里面显示数据,要显示的数据有好多位小数,就想让它只显示两位小数,