記得要在程式中,處理鍵盤開啟或關閉的動作
来源:互联网 发布:手机英语听力测试软件 编辑:程序博客网 时间:2024/06/15 23:54
記得要在程式中,處理鍵盤開啟或關閉的動作
from:http://ysl-paradise.blogspot.com/2008/12/blog-post.html
and http://www.androidnote.com/Article_Show.asp?ArticleID=557
Handle the open/close keyboard usage for your Android applications
之前寫了一個 Android 版的世界時鐘 (world clock) 程式,自認為應該沒什麼大問題了,就丟上網讓使用者開始下載。嗯,下載數是不少,心喜之餘,還是有幾個人反應,無法完成註冊的問題。
由於,當時 G1 手機沒有到手,只能用模擬機測,測了半天,一直無法重現使用者提到的問題。只好再檢視註冊相關的程式碼,一樣,看了不下十遍,還是沒看到什麼問題。終於,有天想到使用者要註冊時,應該要輸入使用者名稱及註冊碼,而實機不像我們在模擬機上,直接用 PC 的鍵盤輸入,他應該要打開鍵盤輸入才行。會不會,是這個問題的關係?
首先,第一個是做的是,要如何在模擬機上,模擬打開鍵盤這個動作?告訴你,你在網路上一定找不到這樣的資訊。今天就分享給你,這可是我嘗試了許久,才發現的秘訣。
告訴你,答案就是按下 PC 鍵盤上的 KEYPAD_7 or KEYPAD_9 鍵。疑,這不就是 如何以程式的方式,旋轉 Android 螢幕 文章中,提到的旋轉模擬機螢幕方向 (直立 <-> 水平) 的按鍵嗎?的確是,所有的文件都只說明,這是用來旋轉螢幕的按鍵,根本沒人提到,這也是模擬鍵盤打開或關閉的按鍵。
還來我才知道,在實機上,系統並不會自動隨著機器的旋轉,而自動旋轉螢幕方向。只有當你打開鍵盤時,系統才會自動將螢幕轉成水平。當你收起鍵盤時,才又將螢幕轉成垂直方向。
那這開啟或關閉鍵盤 (正確地,應該說旋轉螢幕方向) 的動作,為什麼會造成程式的問題呢?
原來,這螢幕的旋轉,是靠重新起動你的 activity (不是整個應用程式喔) 而達成的。蝦米,這是什麼意思?我發現,當螢幕準備要開始旋轉時,系統會先殺掉你現在的 activity,接著呼叫底層的顯示系統,旋轉螢幕的方向,最後才又重新啟動你的 activity。從使用者看來,只是螢幕轉個方向而已,什麼事也沒發生。但從程式面來看,這可是已經經歷過一次生死輪迴了。
我寫個簡單的程式,證明給你看。
- public class activity_lift_cycle extends Activity {
- public void
- onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.d("", "onCreate(" + savedInstanceState + ")");
- }
- protected void
- onRestart() {
- super.onRestart();
- Log.d("", "onRestart()");
- }
- protected void
- onStart() {
- super.onStart();
- Log.d("", "onStart()");
- }
- protected void
- onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- Log.d("", "onRestoreInstanceState()");
- }
- protected void
- onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- Log.d("", "onPostCreate()");
- }
- protected void
- onResume() {
- super.onResume();
- Log.d("", "onResume()");
- }
- protected void
- onPostResume() {
- super.onPostResume();
- Log.d("", "onPostResume()");
- }
- protected void
- onSaveInstanceState(Bundle outState) {
- outState.putInt("key", 123);
- super.onSaveInstanceState(outState);
- Log.d("", "onSaveInstanceState()");
- }
- protected void
- onPause() {
- super.onPause();
- Log.d("", "onPause()");
- }
- protected void
- onStop() {
- super.onStop();
- Log.d("", "onStop()");
- }
- protected void
- onDestroy() {
- super.onDestroy();
- Log.d("", "onDestroy()");
- }
- protected void
- onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- Log.d("", "onNewIntent()");
- }
- }
首先,當你執行這個程式後,你會看到底下這樣的結果。
onCreate(null)
onStart()
onPostCreate()
onResume()
onPostResume()
可是當你按下 KEYPAD_7 ,將螢幕轉成水平的方向,你會看到底下這樣的結果。
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate(Bundle[{android:viewHierarchyState=
Bundle[{android:views=
android.util.SparseArray@43370a48}], key=123}])
onStart()
onRestoreInstanceState()
onPostCreate()
onResume()
onPostResume()
看到了嗎? onDestroy() 證明系統殺了你的 activity, onCreate() 則是又重新啟動你的 activity。
我原先無法讓使用者無法完成註冊的問題,就是有些 local variables 的值,因為這重起 activity 的動作,而不見了。
這個經驗,讓我學到了,千萬要有程式隨時會被系統殺掉的準備。
有經驗的你,可能會發現為什麼 activity 上 EditText 內的文字,不會隨著旋轉螢幕的動作,而重設。翻翻 EditText 的原始碼,你會發現其實 EditText 也有特別針對這樣的行為來處理。所以說,如果你有寫自己的 custom widget 時,別忘了也要做類似的處理。不過, widget 的處理動作,和 activity 完全不同。有機會的話,再談這部份。
後記,在寫這篇時,又去 Google 了 一下,看到 Rotational Forces…On Your Android App 中,也有詳細提到關於旋轉螢幕的問題處理。值得參考。
- 記得要在程式中,處理鍵盤開啟或關閉的動作
- java Comparable在对象要排序或作比较的时候的简单用法
- 在BCB中的多國語言程式製作(DELPHI)
- 在 '凯盛咨询' 上作得演讲 -- Fintech系列之一:人工智能在金融投资中应用概述
- 關閉程式使程式最小化
- Java中double float 类型的数据(小数)在作计算的时候要注意的
- MFC简单的在对话框程序中加工作线程
- unp代码在ubuntu10.04中需要作的更改
- 在几何画板中作三角形高的方法
- 怎样才能在csdn里或得积分?
- 失或得,全在你心
- 不要在dll或lib的导出函数以string(cstring)作返回值
- 不要在dll或lib的导出函数以string(cstring)作返回值
- [Untiy3d技巧学习]Untiy中用作计数器,或在间隔时间内执行某一代码的方法。
- 关于水晶报表的分页与打印在.NET程式中无效的解决方法.
- SAM的程式筆記
- 教你如何關閉xp你不需要的程式
- 「Windows 無法存取指定的裝置、 路徑或檔案 」 錯誤,當您嘗試安裝、 更新或啟動程式或檔案
- 咋想...
- PDA项目总结,准备阶段
- 总结段错误(Segmentation fault)
- 兰亭序》》收藏自用
- 析构函数、Finalize和Dispose
- 記得要在程式中,處理鍵盤開啟或關閉的動作
- 电脑高手常用的五个按钮
- jad的两个简单用法及jadeclipse插件在myeclipse6.x中的安装
- 段错误bug的调试
- 如何设置电脑开机总动连接宽带
- 在linux下安装tomcat6.X不能进入manager的解决
- ServiceOutCome
- 一个IT人士的个人经历,给迷失方向的朋友
- VB,打字游戏