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

在android中选择时,将焦点设置在微调器上,android,android-edittext,spinner,Android,Android Edittext,Spinner,我有一个带有多个EditText和微调器控件的垂直滚动布局。 问题是,当我在选择后选择任何微调器选项时,屏幕会滚动回上次编辑的位置。在此微调器之前,文本正在编辑。重点仍然是我上次编辑的文本。是否有一种方法可以使用当前选定的微调器保持焦点 我正在寻找一种解决方案,它可以通过布局XML在所有微调器上实现,或者应用于所有微调器的一些通用方法。使用此方法可以避免编辑文本焦点: scrollView = (ScrollView) findViewById(R.id.scrollView_id);

我有一个带有多个EditText和微调器控件的垂直滚动布局。 问题是,当我在选择后选择任何微调器选项时,屏幕会滚动回上次编辑的位置。在此微调器之前,文本正在编辑。重点仍然是我上次编辑的文本。是否有一种方法可以使用当前选定的微调器保持焦点


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

使用此方法可以避免编辑文本焦点:

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

我在Ryderz的帮助下解决了这个问题。代码如下:

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

然后我为我的文本视图设置了android:focusable=“true”,这样当焦点从editText中移除时,可以在滚动时选择文本视图作为焦点。这样,用户就不会在屏幕上看到任何聚焦控件。

我也遇到了与您相同的问题,我已经用此解决方案解决了

mSpinner.setFocusableInTouchMode(true);
mSpinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            if (mSpinner.getWindowToken() != null) {
                mSpinner.performClick();
            }
        }
    }
});
我重新定义了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
    }

}
如果您想保持焦点,请不要执行“clearFocus()”

以下是我的解决方案

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

谢谢你的回复。但我有多个EditText控件。因此,我希望避免对所有edittext单独实现clearFocus()。它会从edittext中删除焦点,但屏幕仍会滚动到edittext。感谢您的帮助。我为我的文本视图设置了android:focusable=“true”,并添加了scrollView.requestFocusFromTouch();将焦点发送到任何可见的子对象。现在很好用。没有为scrollview请求焦点并将textviews设置为可聚焦,屏幕滚动到布局的第一个编辑文本,尽管它没有聚焦。有效的解决方案。试试看!您可以简单地使用getCurrentFocus()方法,而不是使用多个if语句来找出哪个edittext具有焦点。它将返回此时具有焦点的视图。然后可以对该视图调用clearFocus()。