2010-11-22 10 views
2

フォームアクティビティのスピナーに問題があります。スピナーとフォーカス

ユーザーが「タッチ」したときにスピナーがフォーカスを得ることを期待していましたが、これは起こりそうにありません。異なるコンポーネント間を移動するためにトラッカーボール(Nexus One上)を使用すると、スピナーのみにフォーカスが当てられているようです。

フォームの最初のEditTextビューでandroid:selectAllOnFocus = "true"属性を使用しているため、これは面倒です。スピナーは決してEditTextコンポーネントから遠ざかることがないので、そのコンテンツは常にハイライト(これは醜いIMOです)です。

私は

spinner.requestFocus();

を使用して試してみたが、これは(一見)は効果がありません。

私は、誰もがこの奇妙な行動および/またはその周りの可能な方法を説明することができAdapterView.OnItemSelectedListenerにスピナーにフォーカスを要求しようとしましたが、彼だけ

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

になりました。

多くのおかげで、あなたが最初のsetFocusableInTouchMode()を使用する必要が

ティム

+0

私は自分のフォームで同じ動作をしますが、私のフォームは何らかの理由で動作します。スピナーから何かを選択するたびにこの警告が表示されます。 – JPM

答えて

1

。その後、別の問題に遭遇します。スピナーを2回タップして変更する必要があります(フォーカスを設定するには一度、次にオプションのリストを表示するにはもう一度)。私の解決策は、最初のタップからフォーカスゲインが第二をシミュレートする原因と私自身のスピナーサブクラスを作成することです:適切な信用を与えるために

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にインスピレーションを得ました。