編輯:關於Android編程
開發隨筆,小結項目開發中的得與失,要點如下:
進展-推薦功能及相關頁面:
1.相關控件的使用:TimePicker、RadioGroup、RadioButton、Button的隱藏;
時間選擇控件TimePicker,
A view for selecting the time of day, ineither 24 hour or AM/PM mode. The hour, each minute digit, and AM/PM (ifapplicable) can be conrolled by vertical spinners. The hour can be entered bykeyboard input. Entering in two digit hours can be accomplished by hitting twodigits within a timeout of about a second (e.g. '1' then '2' to select 12). Theminutes can be entered by entering single digits. Under AM/PM mode, the usercan hit 'a', 'A", 'p' or 'P' to pick.
最好的學習材料,官方文檔:http://www.android-doc.com/reference/android/widget/TimePicker.html
常見方法包括:setIs24HourView設置24小時制、setOnTimeChangedListener實時監聽最新時間。
startTime_tp_suggest.setIs24HourView(true); startTime_tp_suggest.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int minute) { mStartHour = hour; mStartMinute = minute; } });
lou_rg_suggest = (RadioGroup) findViewById(R.id.lou_rg_suggest); lou_rg_suggest.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int id) { switch (id){ case R.id.e11_rb_suggest: Toast.makeText(SuggestActivity.this, "E11", Toast.LENGTH_SHORT).show(); mLou = "E11"; break; case R.id.e13_rb_suggest: Toast.makeText(SuggestActivity.this, "E13", Toast.LENGTH_SHORT).show(); mLou = "E13"; break; default: break; } } });
Button的隱藏,很簡單,在xml文件中添加:
android:visibility="invisible"
需要時只需要調用相關方法顯示即可。
xxx.setVisibility(View.VISIBLE);
相關背景知識:
android view的setVisibility方法值有3個:
1.View.VISIBLE,常量值為0,意思是可見的
2.View.INVISIBLE,常量值是4,意思是不可見的
3.View.GONE,常量值是8,意思是不可見的,並且不占用布局空間。
View.class官方源代碼:
public static final int VISIBLE = 0; public static final int INVISIBLE = 4; public static final int GONE = 8;
2.推薦邏輯,樓層的匹配,時間安排分情況討論;
以安排會議情況為例,畫了一個示意圖,簡單梳理邏輯:
3.數據庫查詢query()函數參數,多游標的使用以及判斷:
Cursor cursor = db.query("Room", null, null, null, null, null, "name,time");末尾參數ORDER BY 語句用於根據指定的列對結果集進行排序,可以多關鍵字,像本條語句先按name後按time排序。
Cursor:
This interface provides random read-writeaccess to the result set returned by a database query.
Cursor implementations are not required tobe synchronized so code using a Cursor from multiple threads should perform itsown synchronization when using the Cursor.
最好的學習材料,官方文檔:http://www.android-doc.com/reference/android/database/Cursor.html多游標的使用,類似多指針,可以跟著走,也可以隨意走,妙用多多哈,數據庫和游標用完一定要關閉,重要的事情說一遍。
Cursor cursorNext = cursor; //public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) if (cursor.moveToFirst() && cursorNext.moveToFirst()) { do {
cursorNext.moveToPosition(cursor.getPosition() + 1); } } while (cursor.moveToNext()); } cursor.close(); db.close();
4.字符串的處理:分割,比較,格式化;
經常變化的字符串用StringBuffer和它的append方法,提升效率,
time_tv_suggest.setText(new StringBuffer().append(" ").append(FormatTime(mStartHour)) .append(":").append(FormatTime(mStartMinute)) .append("-").append(FormatTime(mEndHour)) .append(":").append(FormatTime(mEndMinute)));
do { String local = cursor.getString(cursor .getColumnIndex("local")); String time = cursor.getString(cursor .getColumnIndex("time")); String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("權興權意-Cursor", "name-" + name + " time-" + time + " local-" + local); String localArray[] = local.split("-"); String timeArray[] = time.split("-"); if(localArray[0].equals(mLou) && localArray[1].equals(mCeng)){ mStartTime = mStartHour + ":" + mStartMinute; mEndTime = mEndHour + ":" + mEndMinute; //區間比較-APP時間位於會議兩組時間之間 if(mStartTime.compareTo(timeArray[1]) > 0){ cursorNext.moveToPosition(cursor.getPosition() + 1); if(name.equals(cursorNext.getString(cursor.getColumnIndex("name")))){ String timeNext = cursorNext.getString(cursor .getColumnIndex("time")); String timeArrayNext[] = timeNext.split("-"); if(timeArrayNext[0].compareTo(mEndTime) > 0){ roomName = name; break; } }else{ //一個房間只有一個會議,會議晚於最晚時間 roomName = name; break; } } } } while (cursor.moveToNext());
private String FormatTime(int time){ String s = Integer.toString(time); if(s.length() == 1){ s = "0" + s; } return s; }
文末小彩蛋:
android studio怎麼查看類中已有的方法:
查詢本類裡面所有的方式快捷鍵:Ctrl+o (需要把AS的快捷鍵設置成Eclipse)
ctrl查看源碼必備操作,至於怎麼把AS快捷鍵設置成Eclipse,請看上一遍博客哈。
小結:
進展-推薦功能及相關頁面:
1.相關控件的使用:TimePicker、RadioGroup、RadioButton、Button的隱藏;
2.推薦邏輯,樓層的匹配,時間安排分情況討論;
3.數據庫查詢query()函數參數,多游標的使用以及判斷;
4.字符串的處理:分割,比較,格式化;
附上核心源碼,教學相長,歡迎交流。
package com.quan.car.qmeeting; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; import dbutils.MyDatabaseHelper; /** * Created by 權興權意 on 2016/8/23. */ public class SuggestActivity extends Activity{ private TimePicker startTime_tp_suggest; private TimePicker endTime_tp_suggest; private TextView time_tv_suggest; private Button yesTime_btn_suggest; private int mStartHour; private int mStartMinute; private int mEndHour; private int mEndMinute; private String mStartTime; private String mEndTime; private RadioGroup lou_rg_suggest; private RadioGroup ceng_rg_suggest; private TextView floor_tv_suggest; private Button yesFloor_btn_suggest; private String mLou; private String mCeng; private Button suggest_btn_suggest; private MyDatabaseHelper dbHelper; private String roomName = "Room1"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.suggest); dbHelper = new MyDatabaseHelper(this, "Meeting.db", null, MyDatabaseHelper.DB_VERSION); time_tv_suggest = (TextView) findViewById(R.id.time_tv_suggest); startTime_tp_suggest = (TimePicker) findViewById(R.id.startTime_tp_suggest); startTime_tp_suggest.setIs24HourView(true); startTime_tp_suggest.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int minute) { mStartHour = hour; mStartMinute = minute; } }); endTime_tp_suggest = (TimePicker) findViewById(R.id.endTime_tp_suggest); endTime_tp_suggest.setIs24HourView(true); endTime_tp_suggest.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int minute) { mEndHour = hour; mEndMinute = minute; } }); yesTime_btn_suggest = (Button) findViewById(R.id.yesTime_btn_suggest); yesTime_btn_suggest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { time_tv_suggest.setText(new StringBuffer().append(" ").append(FormatTime(mStartHour)) .append(":").append(FormatTime(mStartMinute)) .append("-").append(FormatTime(mEndHour)) .append(":").append(FormatTime(mEndMinute))); } }); floor_tv_suggest = (TextView) findViewById(R.id.floor_tv_suggest); lou_rg_suggest = (RadioGroup) findViewById(R.id.lou_rg_suggest); lou_rg_suggest.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int id) { switch (id){ case R.id.e11_rb_suggest: Toast.makeText(SuggestActivity.this, "E11", Toast.LENGTH_SHORT).show(); mLou = "E11"; break; case R.id.e13_rb_suggest: Toast.makeText(SuggestActivity.this, "E13", Toast.LENGTH_SHORT).show(); mLou = "E13"; break; default: break; } } }); ceng_rg_suggest = (RadioGroup) findViewById(R.id.ceng_rg_suggest); ceng_rg_suggest.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int id) { switch (id){ case R.id.ceng1_rb_suggest: Toast.makeText(SuggestActivity.this, "1", Toast.LENGTH_SHORT).show(); mCeng = "1"; break; case R.id.ceng2_rb_suggest: Toast.makeText(SuggestActivity.this, "2", Toast.LENGTH_SHORT).show(); mCeng = "2"; break; case R.id.ceng3_rb_suggest: Toast.makeText(SuggestActivity.this, "3", Toast.LENGTH_SHORT).show(); mCeng = "3"; break; case R.id.ceng4_rb_suggest: Toast.makeText(SuggestActivity.this, "4", Toast.LENGTH_SHORT).show(); mCeng = "4"; break; case R.id.ceng5_rb_suggest: Toast.makeText(SuggestActivity.this, "5", Toast.LENGTH_SHORT).show(); mCeng = "5"; break; default: break; } } }); yesFloor_btn_suggest = (Button) findViewById(R.id.yesFloor_btn_suggest); yesFloor_btn_suggest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { floor_tv_suggest.setText(new StringBuffer().append(" ").append((mLou)) .append("-").append(mCeng)); } }); suggest_btn_suggest = (Button) findViewById(R.id.suggest_btn_suggest); suggest_btn_suggest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("Room", null, null, null, null, null, "name,time"); Cursor cursorNext = cursor; //public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) if (cursor.moveToFirst() && cursorNext.moveToFirst()) { do { String local = cursor.getString(cursor .getColumnIndex("local")); String time = cursor.getString(cursor .getColumnIndex("time")); String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("權興權意-Cursor", "name-" + name + " time-" + time + " local-" + local); String localArray[] = local.split("-"); String timeArray[] = time.split("-"); if(localArray[0].equals(mLou) && localArray[1].equals(mCeng)){ //1.會議室為空,無會議,直接預訂; if (time.equals("")){ roomName = name; break; } mStartTime = mStartHour + ":" + mStartMinute; mEndTime = mEndHour + ":" + mEndMinute; //3.會議室有多場會議,遍歷操作,區間: //將會議室會議根據時間按降序排列,取區間如圖, //C的開始時間晚於A的結束時間, //C的結束時間早於B的開始時間, if(mStartTime.compareTo(timeArray[1]) > 0){ cursorNext.moveToPosition(cursor.getPosition() + 1); if(name.equals(cursorNext.getString(cursor.getColumnIndex("name")))){ String timeNext = cursorNext.getString(cursor .getColumnIndex("time")); String timeArrayNext[] = timeNext.split("-"); if(timeArrayNext[0].compareTo(mEndTime) > 0){ roomName = name; break; } }else{ //2.2預訂會議開始時間晚於原會議結束時間; roomName = name; break; } } //2.會議室只有1場會議: //2.1預訂會議結束時間早於原會議開始時間; if(timeArray[0].compareTo(mEndTime) > 0) roomName = name; break; } // Log.d("權興權意:", "nameCur-" + nameCur); // Log.d("權興權意:", "passwordCur-" + passwordCur); // Log.d("權興權意:", "idCur-" + idCur); } while (cursor.moveToNext()); } cursor.close(); db.close(); Intent intent = new Intent(); intent.setClass(SuggestActivity.this, RoomListActivity.class); intent.putExtra("roomName",roomName); startActivity(intent); } }); // Toast.makeText(SuggestActivity.this, "SuggestActivity--" + mHour + ":" + mMinute, // Toast.LENGTH_SHORT).show(); } private String FormatTime(int time){ String s = Integer.toString(time); if(s.length() == 1){ s = "0" + s; } return s; } }
一、對Canvas進行操作對Canvas的一系列操作,是指對Canvas進行旋轉、平移、縮放等操作。這些操作可以讓Canvas對象使用起來更加便捷。二、Canvas平移/
開門見山:這裡給出rk 在cameraHAL層的camera數據結構:typedef struct FramInfo{ int phy_addr; int v
Picasso是Square公司開源的一個Android圖形緩存庫,地址http://square.github.io/picasso/,可以實現圖片下載和緩存功能。它的
圖片輪播Banner現在算是比較常見的功能了,可以用來循環播放廣告或者是熱門內容在這裡我利用ViewPager模擬實現了Banner的功能,效果圖如下:可以看到,在剛打開