一、findViewByid 與 setContendView 1、Android界面的各個子元素,似乎應該在主Layout顯示之后創(chuàng)建才可以。 例如: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tedit = (EditText)findViewById(R.id.EditText01); } public void onResume(){ super.onResume(); tedit.setText("abvcd"); } 上面代碼運行正常。而如果,將其修改為如下,則運行就會出錯。 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tedit = (EditText)findViewById(R.id.EditText01); setContentView(R.layout.main); } public void onResume(){ super.onResume(); tedit.setText("abvcd"); } 而且,即使系統(tǒng)中沒有onResume函數(shù),改成如下實現(xiàn),在單擊button時,仍然會提示出錯: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tedit = (EditText)findViewById(R.id.EditText01); setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.Button01); btn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub tedit.setText("abvcd"); } }); } 這說明,一定不是因為onCreate與onResume之間時間過短資源未準備好而導致的,而從源碼和原理上來說,也應該時間間隔過短資源未準備好沒什么關(guān)系。個人理解,findViewById,是按照id去獲取view,則應該在view加載之后才可以。而 setContentView(R.layout.main)應該就是用來加載顯示各個layout.main中的各個view控件的。所以本例中,findViewById應該在 setContentView 之后。事實上,將上面代碼改成如下,進行測試之后,發(fā)現(xiàn)logcat果然有錯誤顯示: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tedit = (EditText)findViewById(R.id.EditText01); if(null == tedit ) { Log.e("Error","tedit is not found"); } setContentView(R.layout.main); } 二、關(guān)于Activity啟動時自動顯示軟鍵盤 【手記】 1、據(jù)資料說,edit獲得焦點時,會自動彈出相應的輸入法軟鍵盤。于是,在xml文件中,對EditText控件設(shè)置屬性,設(shè)定輸入法,并使其默認獲得焦點(<requestFocus />即設(shè)置獲得焦點): <EditText android:text="EditText01" android:id="@+id/EditText01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode = "true" android:inputType="textUri|number"> <requestFocus /> </EditText> 然而,經(jīng)試驗發(fā)現(xiàn)不可以。于是,準備在Activity的onResume事件中通過代碼為EditText設(shè)置焦點,之所以在onResume事件而不在onCreate事件中設(shè)置,是因為onCreate事件發(fā)生時,控件還不能進行相應操作。代碼如下: public void onResume(){ super.onResume(); tedit.requestFocus(); } 經(jīng)過試驗,發(fā)現(xiàn)上面的操作也并不能顯示軟鍵盤。于是... ... 2、直接執(zhí)行顯示軟鍵盤的代碼,如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tedit = (EditText)findViewById(R.id.EditText01); if(null == tedit ) { Log.e("out","tedit is not found"); } focusChangeListener = new OnFocusChangeListener() { @Override public void onFocusChange(View arg0, boolean arg1) { // TODO Auto-generated method stub if(tedit == arg0) { if(arg1) { //tedit.setInputType( InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(tedit,0); } } } }; tedit.setOnFocusChangeListener(focusChangeListener); } public void onResume(){ super.onResume(); tedit.requestFocus(); //tedit.setInputType( InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_URI);//設(shè)置輸入法格式,可以不要 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(tedit,0); //顯示輸入法 tedit.performClick(); //代碼執(zhí)行Click事件 } 經(jīng)過驗證,發(fā)現(xiàn)這樣也并不能將軟鍵盤顯示出來。于是重新搜索,發(fā)現(xiàn)網(wǎng)上有一個方法,可以利用timer來實現(xiàn)該效果。 3、利用timer變通實現(xiàn)自動彈出軟鍵盤 原理是在onCreate實踐中,起一個timer進行計時,在時間到時的回調(diào)函數(shù)中,執(zhí)行軟鍵盤顯示代碼。如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tedit = (EditText)findViewById(R.id.EditText01); if(null == tedit ) { Log.e("out","tedit is not found"); } Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { InputMethodManager imm = (InputMethodManager)tedit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); //Toast.makeText(GuiTest.this, "show", Toast.LENGTH_SHORT).show();//GuiTest是Activity類名,這句不需要 } }, 1000); } 經(jīng)試驗,這樣確實能實現(xiàn)軟鍵盤自動彈出。注意,1000為延時值,不可太短,否則仍然談不出來,也不可太長,否則activity啟動半天之后才彈出,則失去意義了。 另外,起timer也可以在onResume事件中完成。 參考資料: 1、http://blog.sina.com.cn/s/blog_4e5143100100i196.html?retcode=0 //隱藏軟鍵盤 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); //顯示軟鍵盤,控件ID可以是EditText,TextView,android 1.6的SDK本身有問題,無法設(shè)置manifest文件或者直接show出軟鍵盤,preformclick也不行,必須手動click一個控件 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0); //InputMethodManager im = (InputMethodManager) edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); im.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 2、http://tech./shouji/android/41261.html android 界面加載后彈出軟鍵盤核心提示:在onCreate函數(shù)中設(shè)定一個定時器,延遲一定時間,android 界面加載后彈出軟鍵盤,彈出軟鍵盤,不能彈出軟鍵盤的主要原因是在onCreate函數(shù)中Android程序未將屏幕繪制完成在onCreate函數(shù)中設(shè)定一個定時器,延遲一定時間,彈出軟鍵盤。 不能彈出軟鍵盤的主要原因是在onCreate函數(shù)中Android程序未將屏幕繪制完成。 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { InputMethodManager imm = (InputMethodManager)vv.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); Toast.makeText(test.this, "show", Toast.LENGTH_SHORT).show(); } }, 1000); |
|
來自: techres > 《Android界面》