OSDN Git Service

Heed the focusability flag in SearchView and set the default to true.
authorAmith Yamasani <yamasani@google.com>
Tue, 25 Jan 2011 19:58:09 +0000 (11:58 -0800)
committerAmith Yamasani <yamasani@google.com>
Tue, 25 Jan 2011 20:10:56 +0000 (12:10 -0800)
Bug: 3385804

Also, allow navigation through keyboard.

Change-Id: I444f142518172b35f33c2a5129179ac996d80dc7

core/java/android/widget/SearchView.java
core/res/res/layout/search_view.xml

index b86366c..a37f12e 100644 (file)
@@ -214,6 +214,8 @@ public class SearchView extends LinearLayout {
             }
         });
 
+        boolean focusable = true;
+
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchView, 0, 0);
         setIconifiedByDefault(a.getBoolean(R.styleable.SearchView_iconifiedByDefault, true));
         int maxWidth = a.getDimensionPixelSize(R.styleable.SearchView_maxWidth, -1);
@@ -226,6 +228,11 @@ public class SearchView extends LinearLayout {
         }
         a.recycle();
 
+        a = context.obtainStyledAttributes(attrs, R.styleable.View, 0, 0);
+        focusable = a.getBoolean(R.styleable.View_focusable, focusable);
+        a.recycle();
+        setFocusable(focusable);
+
         // Save voice intent for later queries/launching
         mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
         mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -259,10 +266,18 @@ public class SearchView extends LinearLayout {
     /** @hide */
     @Override
     public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
-        if (mClearingFocus || isIconified()) return false;
-        boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect);
-        if (result) updateViewsVisibility(mIconifiedByDefault);
-        return result;
+        // Don't accept focus if in the middle of clearing focus
+        if (mClearingFocus) return false;
+        // Check if SearchView is focusable.
+        if (!isFocusable()) return false;
+        // If it is not iconified, then give the focus to the text field
+        if (!isIconified()) {
+            boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect);
+            if (result) updateViewsVisibility(false);
+            return result;
+        } else {
+            return super.requestFocus(direction, previouslyFocusedRect);
+        }
     }
 
     /** @hide */
@@ -527,7 +542,6 @@ public class SearchView extends LinearLayout {
         updateCloseButton();
         updateVoiceButton(!hasText);
         updateSubmitArea();
-        requestLayout();
     }
 
     private boolean hasVoiceSearch() {
@@ -580,7 +594,7 @@ public class SearchView extends LinearLayout {
 
     private void setImeVisibility(boolean visible) {
         InputMethodManager imm = (InputMethodManager)
-        getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+                getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
 
         // We made sure the IME was displayed, so also make sure it is closed
         // when we go away.
@@ -903,8 +917,8 @@ public class SearchView extends LinearLayout {
     }
 
     private void onSearchClicked() {
-        mQueryTextView.requestFocus();
         updateViewsVisibility(false);
+        mQueryTextView.requestFocus();
         setImeVisibility(true);
         if (mOnSearchClickListener != null) {
             mOnSearchClickListener.onClick(this);
index 0a7cd3c..c41c2de 100644 (file)
                 android:layout_gravity="center_vertical"
                 android:background="?android:attr/selectableItemBackground"
                 android:src="?android:attr/searchViewCloseIcon"
+                android:focusable="true"
             />
 
         </LinearLayout>
             android:background="?android:attr/selectableItemBackground"
             android:src="?android:attr/searchViewGoIcon"
             android:visibility="gone"
+            android:focusable="true"
         />
 
         <ImageView
             android:src="?android:attr/searchViewVoiceIcon"
             android:background="?android:attr/selectableItemBackground"
             android:visibility="gone"
+            android:focusable="true"
         />
     </LinearLayout>
 </LinearLayout>