2012-06-18 51 views
3

我希望應用程序啓動時應用程序中的EditText具有默認的遊標。 我嘗試使用Android RequestFocus()無效

<EditText 
    android:id="@+id/idInput" 
    android:layout_width="480dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:ems="10" > 

    <requestFocus /> 
</EditText> 

userIdInput = (EditText)findViewById(R.id.idInput); 
userIdInput.setFocusable(true); 
userIdInput.setFocusableInTouchMode(true); 
userIdInput.requestFocus(); 

但沒有它似乎有任何影響。應用程序啓動時遊標無處可見,我必須手動單擊EditText以使光標顯示在其上。

哪裏可能出問題?

順便說一句,我正在開發Android 4.0.3平板電腦。

+0

你有沒有給''你要在XML文件,該文件'EditText'的設置重點是什麼? – Praveenkumar

+0

是的。也完成了。 – Swayam

回答

18

試試這個

userIdInput = (EditText)findViewById(R.id.idInput); 

userIdInput.post(new Runnable() 
    { 
     public void run() 
     { 
     userIdInput .requestFocus(); 
     } 
    }); 
+8

任何人都可以解釋爲什麼這是有益的和/或必要的? – greg7gkb

+2

This Works!但是,有人解釋爲什麼請。 – conca

+4

事情隱藏在Android活動生命週期方法和時序的編排中。 onResume是在UI可見之前運行的最後一個,但是當onResume完成時,UI仍未準備好 - 它已準備好在事件隊列中進行呈現。 將requestFocus放入其中一個生命週期方法中,使其在UI準備就緒之前運行。 如果您使用view.post(...),則可運行列表放入事件隊列中,該隊列保證在生命週期方法之後運行,並從中調用它。 因此,確保view.post(新的Runnable()....)....在onResume中,那麼你的應用程序將正常運行。 –