在android中选择时,将焦点设置在微调器上

时间:2014-04-15 05:47:48

标签: android android-edittext spinner

我有一个带有多个EditText和Spinner控件的垂直滚动布局。 问题是当我选择任何微调器选项后,屏幕滚动回到最后一个EditText正在编辑此微调器之前。 Focus仍然是我正在编辑的最后一个EditText。有没有办法可以保持焦点与当前选定的微调器。

我正在寻找一种解决方案,可以在布局XML或某些通用方法的所有微调器上实现,以应用于所有微调器。

4 个答案:

答案 0 :(得分:3)

使用它来避免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;
            }
        });

答案 1 :(得分:3)

这是我的解决方案。

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

答案 2 :(得分:1)

我在莱德兹回答的帮助下解决了这个问题。这是代码:

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;
        }
    });

然后我为我的textViews设置了android:focusable =“true”,以便在从editText中删除焦点时滚动,然后可以选择Textviews进行焦点。以这种方式,用户在屏幕上看不到任何聚焦控制。

答案 3 :(得分:0)

我遇到了和你一样的问题,我已经解决了这个问题。

我重新定义了OnItemSelectedListener,当微调器更改值时,我会关注焦点,然后再次释放。

这是我的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
    }

}

在我的代码中,我这样做

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

如果你想保持焦点,不要做“clearFocus()”。