Android編程常用技巧實(shí)例總結(jié)
本文實(shí)例講述了Android編程常用技巧。分享給大家供大家參考,具體如下:
1. 登錄的時(shí)候,如果輸入有誤,則輸入框左右震動(dòng),表示輸入有誤
在res下準(zhǔn)備一個(gè)anim文件夾,里面包含兩個(gè)文件,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坐標(biāo)從0到10晃動(dòng)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. 當(dāng)一個(gè)Activity中很多地方需要使用到對(duì)話框,可以如下操作:
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. 標(biāo)準(zhǔn)的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;
打印結(jié)果:width:320.0,height:480.0,screenWidth:320,screenHeight:480
dpi值的是屏幕上每英寸的像素點(diǎn)。如果一個(gè)160dpi的屏幕,1dp=1px。假如我現(xiàn)在有一個(gè)480*800,160dp的屏,那么他的實(shí)際面積要比480*800,240dp的屏面積大,但是清晰度卻不如后面這個(gè)屏。
如果有些實(shí)體手機(jī)在做測(cè)試的時(shí)候發(fā)現(xiàn)得到的分辨率比實(shí)際的分辨率小很多,那么這里得到的是dp單位的像素值,可以通過dp的密度值來轉(zhuǎn)換,如下:
480*800的手機(jī)(WVGA)density=240。
轉(zhuǎn)換公式如下:
pixs =dips * (density/160) dips=(pixs*160)/density
480*800單位是px。而320*533單位是dp
5,資源的一些應(yīng)用
* 不同的layout
Android手機(jī)屏幕大小不一,有480x320,640x360,800x480.怎樣才能讓App自動(dòng)適應(yīng)不同的屏幕呢? 其實(shí)很簡單,只需要在res目錄下創(chuàng)建不同的layout文件夾,比如:layout-640x360,layout-800x480,所有的layout文件在編譯之后都會(huì)寫入R.java里,而系統(tǒng)會(huì)根據(jù)屏幕的大小自己選擇合適的layout進(jìn)行使用。
* hdpi、mdpi、ldpi
前的版本中,只有一個(gè)drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個(gè),這三個(gè)主要是為了支持多分辨率。
* drawable- hdpi、drawable- mdpi、drawable-ldpi的區(qū)別:
drawable-hdpi里面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480)
drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320)
系統(tǒng)會(huì)根據(jù)機(jī)器的分辨率來分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。在開發(fā)程序時(shí)為了兼容不同平臺(tái)不同屏幕,建議各自文件夾根據(jù)需求均存放不同版本圖片。
* 屏幕方向
橫屏豎屏自動(dòng)切換
可以在res目錄下建立layout-port和layout-land兩個(gè)目錄,里面分別放置豎屏和橫屏兩種布局文件,這樣在手機(jī)屏幕方向變化的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用相應(yīng)的布局文件,避免一種布局文件無法滿足兩種屏幕顯示的問題。
* 禁用自動(dòng)切換
只需要在AndroidManifest.xml文件中加入android:screenOrientation屬性限制。
Android:screenOrientation="landscape" //是限制此頁面橫屏顯示
Android:screenOrientation="portrait" //是限制此頁面數(shù)豎屏顯示
* 字體自適應(yīng)大小
方法1:
首先根據(jù)不同分辨率獲取不同字體大小。
在RES里創(chuàng)建
values-480x320/strings.xml 里面設(shè)置<dimen name="Text_size">30px</dimen>
和
values-800x400/strings.xml 里面設(shè)置<dimen name="Text_size">40px</dimen>
分別代表480X320 和 800X400分辨率情況下 字號(hào)為30px和40px;
在java文件中這樣調(diào)用
方法2:
在視圖的 onsizechanged里獲取視圖寬度,一般情況下默認(rèn)寬度是320,所以計(jì)算一個(gè)縮放比率rate = (float) w/320 w是實(shí)際寬度
然后在設(shè)置字體尺寸時(shí) paint.setTextSize((int)(8*rate)); 8是在分辨率寬為320 下需要設(shè)置的字體大小實(shí)際字體大小 = 默認(rèn)字體大小 x rate
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android編程之文件讀寫操作與技巧總結(jié)【經(jīng)典收藏】
- Android編程之OpenGL繪圖技巧總結(jié)
- Android編程開發(fā)之性能優(yōu)化技巧總結(jié)
- Android Studio使用小技巧:提取方法代碼片段
- Android Studio使用小技巧:自定義Logcat
- Android開發(fā)技巧之我的菜單我做主(自定義菜單)
- 解析Android開發(fā)優(yōu)化之:從代碼角度進(jìn)行優(yōu)化的技巧
- android 為應(yīng)用程序創(chuàng)建桌面快捷方式技巧分享
- Android開發(fā)技巧之像QQ一樣輸入文字和表情圖像
- Android Studio使用小技巧:布局預(yù)覽時(shí)填充數(shù)據(jù)
- Android開發(fā)中常用的一些小技巧
- Android實(shí)用編程技巧代碼總結(jié)
相關(guān)文章
Android編程實(shí)現(xiàn)的首頁左右滑動(dòng)切換功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)的首頁左右滑動(dòng)切換功能,涉及Android事件監(jiān)聽及響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
Android JSON數(shù)據(jù)與實(shí)體類之間的相互轉(zhuǎn)化(GSON的用法)
這篇文章主要介紹了Android JSON數(shù)據(jù)與實(shí)體類之間的相互轉(zhuǎn)化(GSON的用法),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
flutter Toast實(shí)現(xiàn)消息提示框
這篇文章主要為大家詳細(xì)介紹了flutter Toast實(shí)現(xiàn)消息提示框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
基于Android實(shí)現(xiàn)百度地圖定位過程詳解
這篇文章主要介紹了基于Android實(shí)現(xiàn)百度地圖定位過程詳解,需要的朋友可以參考下2015-11-11
簡單實(shí)現(xiàn)Android端搜索框示例詳解
這篇文章主要為大家介紹了簡單實(shí)現(xiàn)Android端搜索框示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android打開GPS導(dǎo)航并獲取位置信息返回null解決方案
最近在做一個(gè) Android 項(xiàng)目,需要用到GPS獲取位置信息,從 API 查了一下,發(fā)現(xiàn)獲取位置信息僅需極其簡單的一句即可getLastKnownLocation(LocationManager.GPS_PROVIDER)郁悶的是一直為null,于是搜集整理下,曬出來與大家分享2013-01-01
Android自定義超級(jí)炫酷的ViewPage指示器
由于應(yīng)公司開發(fā)要求,有一個(gè)顏色漸變帶縮放的指示器,雖然網(wǎng)上很多大佬開源的指示器開源庫,但如果一直都是使用別人造的輪子,那么對(duì)于自身的能力是毫無提升作用的,即使是參考別人的,然后自己動(dòng)手寫一遍那對(duì)于自身來說也是一種升華2022-07-07

