2010-11-22 11 views
2

양식 활동에서 스피너에 문제가 있습니다.회 전자 및 포커스

나는 사용자가 "만졌을 때"초점을 맞추기를 기대했지만 이것은 발생하지 않는 것 같습니다. 회 전자 공 (Nexus One)을 사용하여 여러 구성 요소간에 이동하는 경우 회 전자에만 초점이 맞춰지는 것 같습니다.

폼의 첫 번째 EditText보기에서 android : selectAllOnFocus = "true"특성을 사용하기 때문에 성가신 느낌입니다. 스피너는 결코 EditText 구성 요소에서 멀리 떨어져 있지 않으므로 그 내용은 언제나 하이라이트됩니다 (이것은 못생긴 IMO입니다).

나는

spinner.requestFocus();

를 사용하여 시도했지만이 (겉으로는) 아무런 영향을 미치지 않습니다.

나는 AdapterView.OnItemSelectedListener의 회 전자에 초점을 요청하려했지만 자신은 사람이 이상한 행동 및/또는 주위 가능한 방법을 설명 할 수

Window already focused, ignoring focus gain of: [email protected]

발생합니다.

많은 감사,

+0

나는 내 양식에서 동일한 동작을하지만 내 양식은 회 전자에서 무언가를 선택할 때마다이 경고를받는 몇 가지 이유 때문에 실행됩니다. – JPM

답변

1

는 먼저 setFocusableInTouchMode()를 사용해야합니다. 그런 다음 다른 문제가 발생합니다 : 회 전자를 두 번 눌러서 변경하십시오 (초점을 설정하려면 한 번, 옵션의 목록을 보려면 다시 한 번). 내 솔루션은 두 번째 시뮬레이션하는 최초의 탭에서 초점 이득을 일으키는 내 자신의 회 전자의 서브 클래스 만드는 것입니다 :

class MySpinnerSubclass extends Spinner { 

    private final OnFocusChangeListener clickOnFocus = new OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 

      // We don't want focusing the spinner with the d-pad to expand it in 
      // the future, so remove this listener until the next touch event. 
      setOnFocusChangeListener(null); 
      performClick(); 
     } 
    }; 

    // Add whatever constructor(s) you need. Call 
    // setFocusableInTouchMode(true) in them. 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     int action = event.getAction(); 
     if (action == MotionEvent.ACTION_DOWN) { 

      // Only register the listener if the spinner does not already have 
      // focus, otherwise tapping it would leave the listener attached. 
      if (!hasFocus()) { 
       setOnFocusChangeListener(clickOnFocus); 
      } 
     } else if (action == MotionEvent.ACTION_CANCEL) { 
      setOnFocusChangeListener(null); 
     } 
     return super.onTouchEvent(event); 
    } 
} 

적절한 신용을 제공하기를, 나는 Kaptkaos's answer에서 this question에 영감을 얻었다.