Android编程常用技巧实例总结

 更新时间:2015年11月18日 11:43:44   作者:段残梦  
这篇文章主要介绍了Android编程常用技巧实例总结,包括Android对话框、分辨率、资源、字体等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Android学习笔记(二)之电话拨号器

    Android学习笔记(二)之电话拨号器

    目前手机市场上android已经具有强大的霸主地位,吸引了很多的追棒者,android学习越来越火热,本文给大家介绍android学习笔记(二)之电话拨号器,感兴趣的朋友一起学习吧
    2015-11-11
  • Android ToggleButton 详解及实例代码

    Android ToggleButton 详解及实例代码

    这篇文章主要介绍了Android ToggleButton 详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • iBeacon使用蓝牙连接范围精确到1-3米

    iBeacon使用蓝牙连接范围精确到1-3米

    这篇文章主要为大家详细介绍了iBeacon使用蓝牙连接范围精确到1到3米,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Android 仿微信数字键盘

    Android 仿微信数字键盘

    大部分的金融App会对默认的数字键盘进行处理,以实现自定义的数字安全键盘。基于此,本文对对微信数字键盘样式进行了仿写,实现了一套自定义的数字安全键盘(支持随机数字分布)。
    2021-05-05
  • Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像

    Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像

    android GB版本的camera录像过程中按“菜单”键会停止录像,改成录像时按menu键不做处理,具体修改方法如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android中实现下载和解压zip文件功能代码分享

    Android中实现下载和解压zip文件功能代码分享

    这篇文章主要介绍了Android中实现下载和解压zip文件功能代码分享,本文直接给出了实现代码,需要的朋友可以参考下
    2015-03-03
  • 如何通过Android Logcat插件分析firebase崩溃问题

    如何通过Android Logcat插件分析firebase崩溃问题

    android crash Crash(应用崩溃)是由于代码异常而导致App非正常退出,导致应用程序无法继续使用,所有工作都停止的现象,本文重点介绍如何通过Android Logcat插件分析firebase崩溃问题,感兴趣的朋友一起看看吧
    2024-01-01
  • Kotlin协程的启动方式介绍

    Kotlin协程的启动方式介绍

    这篇文章我们来讲协程的启动,毕竟协程是一个很强大的设计模式,深入了解需要花很多的时间,我们先从简单开始,其实学会了简单的使用,基本已经可以满足我们平时的开发需要了,话不多说,开始
    2022-09-09
  • Android UI设计与开发之ViewPager仿微信引导界面以及动画效果

    Android UI设计与开发之ViewPager仿微信引导界面以及动画效果

    这篇文章主要为大家详细介绍了Android UI设计与开发之ViewPager仿微信引导界面以及动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android TextWatcher内容监听死循环案例详解

    Android TextWatcher内容监听死循环案例详解

    这篇文章主要介绍了Android TextWatcher内容监听死循环案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论