Androidプログラミングの常用技巧例のまとめ


本論文の実例はAndroidプログラミングの一般的なテクニックを述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
1.ログインする時、入力が間違っていると入力枠が左右に振動し、入力が間違っていることを示します。
resの下にanimフォルダを用意します。中には二つのファイルが含まれています。ロゴshare.xmlとmain_ロゴcycle_7.xml、
そのうち、main_ロゴsharke.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" />

上の書類の中でメールを引用しました。ロゴ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.標準的なアドホッターのフォーマットは、後でこのような形で書きます。

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.スクリーン解像度を取得する2つの方法

//   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:32.0、height:48.0、screenWidth:320、screenHeight:480
dpi値は画面上の各インチのピクセルポイントです。160 dpiの画面があれば、1 dp=1 pxです。もし私が今480×800の画面を持っていると、彼の実際の面積は480×800、240 dpのスクリーン面積より大きいですが、鮮明度は後ろのスクリーンに及ばないです。
もしいくつかの本体の携帯電話がテストをする時に得られた解像度が実際の解像度より小さいことがわかったら、ここで得られたのはdp単位の画素値で、dpの密度値で変換できます。
480*800の携帯電話(WVGA)density=240。
変換式は以下の通りです。

pixs =dips * (density/160)
dips=(pixs*160)/density

480*800単位はpxです。320*533単位はdpです。
5,資源のいくつかの応用
*違うラyout
Androidの携帯電話の画面サイズは違っています。480 x 320、640 x 360、800 x 480があります。どのようにアプリを自動的に違う画面に適応させることができますか?実はとても簡単で、ただresディレクトリの下で異なっているlayoutフォルダを創建するだけ必要があって、例えば:layout-60 x 360、layout-800 x 480、すべてのlayoutファイルはコンパイルの後でいずれもR.javaに書き込んで、システムはスクリーンの大きさによって自分で適当なlayoutを選んで使います。
*hdpi、mdpi、ldpi
前のバージョンは一つのdrawableだけで、2.1バージョンはdrawable-mdpi、drawable-ldpi、drawable-hdpiの3つがあります。この3つは主にマルチ解像度をサポートするためです。
*drawable-hdpi、drawable-mdpi、drawable-ldpiの違い:
drawable-hdpiの中には、WVGA(480 x 800)、FWVGA(480 x 854)などの高解像度の画像が保存されています。
drawable-mdpiの中には、HVGA(320 x 480)のような中ぐらいの解像度の写真が保存されています。
drawable-ldpiの中には、QVGA(240 x 320)のような低解像度の画像が保存されています。
システムはマシンの解像度によってそれぞれのフォルダに対応する画像を探しに行きます。プログラムを開発する時は、異なるプラットフォームの異なる画面に対応するために、それぞれのフォルダに必要に応じて異なるバージョンの画像を保存することを推奨します。
*スクリーンの方向
横画面の縦画面が自動的に切り替わります。
resディレクトリの下でlayout-portとlayout-landの二つのディレクトリを作ることができます。中には縦スクリーンと横スクリーンの二つのレイアウトファイルを置きます。このように携帯電話の画面の方向が変わる時、システムは自動的に相応のレイアウトファイルを呼び出します。一つのレイアウトファイルが二つのスクリーンの表示に満足できない問題を避けることができます。
*自動切替を無効にする
Android Manifest.xmlファイルにAndroid:screenOrientation属性制限を追加するだけです。
Android:screenOrientation=「landscape」/このページの横画面の表示を制限します。
Android:screenOrientation=「ポータブル」   //は、このページ数の縦画面表示を制限します。
*フォントサイズ
方法1:
まず、異なる解像度で異なるフォントサイズを取得します。
RESで作成
values-480 x 320/strigs.xmlの中に30 px

values-800 x 400/strigs.xmlの中に40 px
それぞれ480 X 320と800 X 400の解像度を表す場合、サイズは30 pxと40 pxである。
javaファイルでこのように呼び出します。
int sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);
方法2:
ビューのonsizenchangedでビューの幅を取得すると、標準幅は320ですので、スケーリングレートrate=(float)w/320を計算します。  w実際幅です
フォントサイズを設定するときは、paint.set TextSize((int)(8*rate);  8は、解像度320で設定するフォントサイズの実際のフォントサイズ=標準フォントサイズx rateです。
ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。