现在的位置: 首页 > 综合 > 正文

記得要在程式中,處理鍵盤開啟或關閉的動作

2014年02月27日 ⁄ 综合 ⁄ 共 4512字 ⁄ 字号 评论关闭

記得要在程式
中,處理鍵盤開啟或關閉的動作

from:http://ysl-paradise.blogspot.com/2008/12/blog-post.html

and  http://www.androidnote.com/Article_Show.asp?ArticleID=557

 

.fullpost{display:inline;}

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。從使用者看來,只是螢幕轉個方向而已,什麼事也沒發生。但從程式面來看,這可是已經經歷過一次生死輪迴了。

我寫個簡單的程式,證明給你看。

  1. public
     
    class
     activity_lift_cycle 
    extends
     Activity {  
  2.   public
     
    void
       
  3.   onCreate(Bundle savedInstanceState) {  
  4.     super
    .onCreate(savedInstanceState);  
  5.     setContentView(R.layout.main);  
  6.       
  7.     Log.d(""

    "onCreate("
     + savedInstanceState + 
    ")"
    );  
  8.   }  
  9.   
  10.   protected
     
    void
       
  11.   onRestart() {  
  12.     super
    .onRestart();  
  13.     Log.d(""

    "onRestart()"
    );  
  14.   }  
  15.   
  16.   protected
     
    void
       
  17.   onStart() {  
  18.     super
    .onStart();  
  19.     Log.d(""

    "onStart()"
    );  
  20.   }  
  21.   
  22.   protected
     
    void
       
  23.   onRestoreInstanceState(Bundle savedInstanceState) {  
  24.     super
    .onRestoreInstanceState(savedInstanceState);  
  25.     Log.d(""

    "onRestoreInstanceState()"
    );  
  26.   }  
  27.   
  28.   protected
     
    void
       
  29.   onPostCreate(Bundle savedInstanceState) {  
  30.     super
    .onPostCreate(savedInstanceState);  
  31.     Log.d(""

    "onPostCreate()"
    );  
  32.   }  
  33.   
  34.   protected
     
    void
       
  35.   onResume() {  
  36.     super
    .onResume();  
  37.     Log.d(""

    "onResume()"
    );  
  38.   }  
  39.   
  40.   protected
     
    void
       
  41.   onPostResume() {  
  42.     super
    .onPostResume();  
  43.     Log.d(""

    "onPostResume()"
    );  
  44.   }  
  45.   
  46.   protected
     
    void
       
  47.   onSaveInstanceState(Bundle outState) {  
  48.     outState.putInt("key"

    123
    );  
  49.     super
    .onSaveInstanceState(outState);  
  50.     Log.d(""

    "onSaveInstanceState()"
    );  
  51.   }  
  52.   
  53.   protected
     
    void
       
  54.   onPause() {  
  55.     super
    .onPause();  
  56.     Log.d(""

    "onPause()"
    );  
  57.   }  
  58.   
  59.   protected
     
    void
       
  60.   onStop() {  
  61.     super
    .onStop();  
  62.     Log.d(""

    "onStop()"
    );  
  63.   }  
  64.   
  65.   protected
     
    void
       
  66.   onDestroy() {  
  67.     super
    .onDestroy();  
  68.     Log.d(""

    "onDestroy()"
    );  
  69.   }  
  70.   
  71.   protected
     
    void
       
  72.   onNewIntent(Intent intent) {  
  73.     super
    .onNewIntent(intent);  
  74.     Log.d(""

    "onNewIntent()"
    );  
  75.   }  
  76. }  

首先,當你執行這個程式後,你會看到底下這樣的結果。

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

中,也有詳細提到關於旋轉螢幕的問題處理。值得參考。

 

 

抱歉!评论已关闭.