編輯:關於Android編程
1、當有兩三個不同類的類且所用方法都一樣,需要完成不能的功能,而這個三個類可能都需要同另外一個類進行交互,而直接把這個類的應用到處傳遞也是很頭疼的,這時可用抽象了類來解決這個問題。當然,Fragement完全可以實現這樣的功能,但也有它所不能施展的地方。
例:
有三個頁面展示的類,為FirstUI、SecondUI、ThirdUI,他們都要實現三個相同的方法。就只需定義一個抽象父類。
代碼如下:
抽象父類:
public abstract class BaseUI implements OnclicListener{
private Context context;
public BaseUI(Context context){
this.context = context;
}
//獲取展示界面
public abstract View getChild();
//標識是哪一個界面
public abstract int getID();
@Override
public void onClick(View v) {
//並不是所有的界面都需要有點擊事件,需要用到時,在復寫這個方法
}
}
然後FirstUI類如下,其余不在鳌訴:
public class FirstUI extends BaseUI {
private Context context;
private TextView view;
public FirstUI(Context context) {
super(context);
this.context = context;
init();
}
public void init(){
view = new TextView(context);
LayoutParams params = view.getLayoutParams();
params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
view.setLayoutParams(params);
view.setBackgroundColor(color.green);
view.setText("This is a first page!");
}
public View getChild() {
return view;
}
@Override
public int getID() {
// TODO Auto-generated method stub
return Constant.VIEW_FIRST; //建議將這個ID類型放在常量類中,便於統一管理
}
}
而在進行用戶界面切換時,不要給出具體實現類,而是采用字節碼,而字節碼
也不是任何類型都可以傳遞進來的,應該只能是BaseUI類的子類。
public void changeUI(Class targetClazz) {
String key = targetClazz.getSimpleName();//獲取類名
if (viewAche.containsKey(key)) {
targetUI = viewAche.get(key);
} else {
try {
//得到他的構造器
Constructor constructor = targetClazz
.getConstructor(Context.class);
//得到這個父類
targetUI = constructor.newInstance(getContext());
viewAche.put(key, targetUI);
} catch (Exception e) {
throw new RuntimeException("BaseUI Constructor Error!");
}
}
}
2、當有兩三個容器各自管理著自己的任務,而第四個容器的內容變化後,
其他容器也應當變化,傳統的方式是在第四個容器的內部進行更改,這樣
做之後增大他們之間的耦合度,應該采用觀察者模式進行解耦,第四個容器
只需通知其他容器,怎麼變更數據,就是他們的事情了。
具體做法,可以采用Java類庫裡的Observable類,也可以自己寫一個這樣的類(不建議哦!你對自己的編碼能力是否有信心),繼承它啊!
//繼承已有工具類Observable
public class MiddleManager extends Observable {
private MiddleManager() {
}
}
private void change() {
// 觀察者模式,改變監聽狀態,通知觀察者數據改變了
this.setChanged();
//otherClass已注冊的類的ID
this.notifyObservers(otherClass.getID());
}
添加觀察的對象。
private void init() {
TitleManager manager = TitleManager.getInstance();
manager.init(this);
manager.showLoginTitle();
BottomManager bottom=BottomManager.getInstrance();
bottom.init(this);
bottom.showCommonBottom();
MiddleManager middle = MiddleManager.getInstance();
middle.setMiddle(ii_middle);
middle.changeUI(HallViewPager.class);
//觀察者模式,添加觀察者
middle.addObserver(manager);
middle.addObserver(bottom);
}
被觀察者實現Observer接口,更新數據
//實現Obserever接口,實現Observer的方法
public class TitleManager implements Observer{
@Override
public void update(Observable observable, Object data) {
//干點壞事,別人都不知道
}
}
3、一個組件想要得到當前上下文,可以用父組件來獲取,如下:
middle是一個Linearlayout,這樣做可以防止當前上下文到處傳遞引用。
public class ClassTemp{
public Context getContext() {
return middle.getContext();
}
//通過view自己的父親那裡得到移除的方法,把自己干掉,就是自殺
public void init(LinearLayout view){
ViewGroup parent=(ViewGroup)view.getParent();
parent.removeView(view);
}
}
4、當使用LinearLayout布局是,發現(圖.1)中的情況,這說明布局文件的全屏顯示沒有起作用,導致的原因是root為空的時候,它不會設置LayoutParams,所做法是自己去填充一下。代碼如下:
showInMiddle = (LinearLayout) View.inflate(context, R.layout.il_hall1,
null);
if (showInMiddle.getLayoutParams() == null) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
showInMiddle.setLayoutParams(params);
}
圖 1 手機界面未填充滿效果圖(盜圖)
5、動態更改ListView的孩子,不影響已經加載的item。
首先為每一個item設置一個tag:
holder.iv_news.setTag(position);
得到要更新的組件:
TextView view = listview.findViewWithTag(position);
進行更新即可;
6、當要在GridView中顯示很多個相同的圖片,而只是裡面的文字不同,比如彩票的號碼,他們的背景圖片都一樣,
只是他們顯示的文字不一樣,那麼現在我就可以用TextView來填充,不用將每張圖片都畫一遍,那樣做的代價是很
大的,例子如下:
@Override
public int getCount() {
// TODO Auto-generated method stub
return endNum; //你要顯示的球的個數
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
**TextView view = new TextView(context);
DecimalFormat decimalFormat = new DecimalFormat("00");
view.setText(decimalFormat.format(position + 1));
view.setBackgroundResource(R.drawable.id_defalut_ball);
view.setTextSize(16);
view.setGravity(Gravity.CENTER);**
return view ;
}
7、當有多個TextView要顯示,並且顏色還不一樣,可以用fromHtml進行轉化,在也不需要寫那麼的TextView了,例如:
定義數據:
NUM 注 金額: MONEY元]]>
String noticeInfo = context.getResources().getString(
R.string.is_shopping_list_notice);
noticeInfo = StringUtils.replaceEach(noticeInfo, new String[] { "NUM",
"MONEY" }, new String[] { lotterynumber.toString(),
lotteryvalue.toString() });
// Html.fromHtml(notice):將notice裡面的內容轉換
notice.setText(Html.fromHtml(noticeInfo));
8、當在做一個手機端程序,需要上傳數據到網絡,但又苦於用戶可能沒有網絡,此時可以采用離線上傳的做法。
首先,在本地數據庫你也可能緩存了數據,用戶沒上傳成功一條,你都要記錄到本地數據庫,已實現數據同步,
但又要避免不斷發送和接受重復數據,導致用戶流量增加。此時,可以在設計數據庫時設計兩個表,一個是本地
緩存表,一個是待上傳的數據表,每上傳成功一個就刪去待上傳數據表中的數據。這種做法凍結資金表。
9、項目使用的配置文件(bean.properties)必須跟隨在src目錄下。
10、圖片中紅色框裡的東西代表,當把apk文件變為jar包的時候,讓程序去自動管理資源文件的ID,不勾選會出現很蛋疼的問題(資源文件命名規則很重要)。
11、Android中點擊圖標不顯示activity界面的辦法,在清單文件裡設置系統主題不顯示界面(鎖屏軟件用得上哦)。
android:theme="@android:style/Theme.NoDisplay" />
12、建立殺不死的服務。這個有點狠,違背道德啊,僅供學習測試參考,開發人員慎用,出現後果自負,與本小編無關。
(1)進程守護
創建連個相同的服務,在
@Override
public void onDestroy() {}
方法裡對另外一個服務啟動,反過來相同,便可以達到目的
(2)廣播接收者
用廣播監聽各種廣播事件,當這個時間發生後,便會啟動這個服務;
13、Android引用資源位圖更改大小方法
//以Drawable取得資源裡的圖片
Drawable drawable = this.getResources().getDrawable(R.drawable.white);
//設置位圖的大小與位置
drawable.setBounds(0, 0, pointSize, pointSize);
//創建一個內容為空的位圖對象,這個位圖對象在內存裡是空的,並沒有什麼內容
Bitmap bitmap = Bitmap.createBitmap(pointSize, pointSize, Config.ARGB_8888);
//創建一個畫布,將上面創建的位圖畫在這個畫布上,此時這個畫布也是空的,並沒有什麼東西
Canvas can = new Canvas(bitmap);
//調用Drawable自身的draw方法,將它自己畫在剛才創建的額畫布上
drawable.draw(can);
//最候,便可以得到自己想要多大並且可以在人員位置繪畫的drawable資源裡的圖片
canvas.draw(bitmap,x,y,paint);
14、如何選擇最佳存儲選項
(1)如果數據可以使用鍵/值對來標識,那麼久使用SharedPreferences對象。
(2)如果需要存儲臨時數據,勇士內部存儲器是一個很好的選擇。
(3)有時需要和其他用戶共享應用 程序數據,這時候可以將文件存儲在設備上的SD卡上。
15、讓文本框獲得焦點,但不顯示輸入法面板
<activity android:label="@string/app_name" android:name="com.example.autoui.MainActivity" android:windowsoftinputmode="stateHidden"> <intent-filter> <action android:name="android.intent.action.MAIN"> <category android:name="android.intent.category.LAUNCHER"> </category></action></intent-filter>
作為開發者我們需要經常站在用戶角度考慮問題,比如在應用商城下載軟件時,當用戶點擊下載按鈕,則會有下載進度提示頁面出現,現在我們通過線程休眠的方式模擬下載進度更新的演示,如
1.Android制定了一條簡單的原則:只允許UI線程(亦即主線程)修改Activity中的UI組件。當一個程序第一次啟動時,Android會同時啟動一條主線程,主線程主
最近項目裡面需要支付功能,boos一致決定用微信支付,所以在網上查了很多資料,說的不全,完了就找以前的同事指教。算是成功集成上去了。在這裡做個總結記錄。1、在APP上集成
寫在前面一家移動互聯網公司,說到底,要盈利總是需要付費用戶的,自己開發支付系統顯然是不明智的,國內已經有多家成熟的移動支付提供商,騰訊就是其中之一。梳理了下微信支付的接入