문제

I have a vertical scrolling layout with multiple EditText and Spinner controls. Problem is when i choose any spinner option after selection the screen scrolls back to the last EditText is was editing before this spinner. The Focus remains with the last EditText i was editing. Is there a way i can keep focus with the current selected spinner.

I am looking for a solution that can be implemented on all spinners from layout XML or some generic method to apply to all spinners.

도움이 되었습니까?

해결책 3

I solved the problem with the help of Ryderz answer. here is the code :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
scrollView = (ScrollView) findViewById(R.id.sv_main);
    scrollView.setOnTouchListener(new OnTouchListener() {
        // to solve focus problem on scrolling
        public boolean onTouch(View v, MotionEvent event) {

            IBinder windowToken = null;
            if (myEditText1.hasFocus()) {
                myEditText1.clearFocus();
                windowToken = myEditText1.getWindowToken();
            }
            if (myEditText2.hasFocus()) {
                myEditText2.clearFocus();
                windowToken = myEditText2.getWindowToken();
            }
            if (myEditText3.hasFocus()) {
                myEditText3.clearFocus();
                windowToken = myEditText3.getWindowToken();
            }
            if (windowToken != null) {
                imm.hideSoftInputFromWindow(windowToken, 0);
            }
            scrollView.requestFocusFromTouch();
            return false;
        }
    });

Then I set the android:focusable="true" for my textViews so that on scroll when focus is removed from editText then the Textviews can be picked for focus. In that way the user doesn't see any focused control on screen.

다른 팁

Here's my solution.

mSpinner.setFocusableInTouchMode(true);
mSpinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            if (mSpinner.getWindowToken() != null) {
                mSpinner.performClick();
            }
        }
    }
});

Use this to avoid EditText Focus :

scrollView = (ScrollView) findViewById(R.id.scrollView_id);
        scrollView.setOnTouchListener(new OnTouchListener() {
            // to solve foocus problem on scrolling
            public boolean onTouch(View v, MotionEvent event) {
                if (myEditText.hasFocus()) {
                    myEditText.clearFocus();
                }
                if (myEditText1.hasFocus()) {
                    myEditText1.clearFocus();
                }

                return false;
            }
        });

I had the same problem like you and I've resolved with this solution.

I've redefined OnItemSelectedListener and when the spinner changes the value, I take the focus and after that, I release again.

This is my class CustomOnItemSelectedListener:

public class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener{

    private Spinner mSpinner;
    private int iCurrentSelection;

    public CustomOnItemSelectedListener(Spinner s){
        mSpinner = s;
        iCurrentSelection = mSpinner.getSelectedItemPosition();
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {

        if (iCurrentSelection != arg2) {

            mSpinner.setFocusableInTouchMode(true);
            mSpinner.requestFocus();
            mSpinner.setFocusableInTouchMode(false);
            mSpinner.clearFocus();

        }

        iCurrentSelection = arg2;
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        //No hace falta hacer nada
    }

}

In my code I do this

Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new CustomOnItemSelectedListener(spinner));

If you want to keep focus, don't do "clearFocus()".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top