在不需要时调用edittext onFocusChangeListener

时间:2013-07-06 08:38:52

标签: android

我目前正在尝试为我的应用程序提供直观的界面。

我有一个oncreate函数可以在加载时激活键盘,效果很好。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_popup);
    reminder = (CheckBox)findViewById(R.id.reminder_option);
    addTask();
    taskField = (EditText)findViewById(R.id.task_name);
    taskField.setHorizontallyScrolling(true);
    taskField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean focus) {
            if (focus) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            }
        }
    });
    taskField.requestFocus();

单击复选框后,键盘将被解除

if(checked){
                imm.hideSoftInputFromWindow(taskField.getWindowToken(), 2);
                dateTitle.setVisibility(View.VISIBLE);
                dateSelector.setVisibility(View.VISIBLE);
                timeTitle.setVisibility(View.VISIBLE);
                timeSelector.setVisibility(View.VISIBLE);
                datetimesperator.setVisibility(View.VISIBLE);

我正在使用2个内部类,一个TimePickerFragment和一个DatePickerFragment,它们都实现了onDate / TimesetListener。

现在的问题是,当弹出窗口设置时间或日期时,键盘会重新激活。

我尝试了Stop EditText from gaining focus at Activity startup

的解决方案

如果将布局设置为可聚焦以从edittext中删除焦点,我将以下代码添加到if checked语句中。     RelativeLayout layout =(RelativeLayout)findViewById(R.id.add_container);     layout.requestFocus();

但是,在设置日期或时间之后,在相应的对话框中,尽管焦点从edittext元素移开,键盘仍然处于激活状态。

如何在退出DatePickerDialog或TimePickerDialog时阻止键盘被激活?

1 个答案:

答案 0 :(得分:2)

专注于EditText很棘手。据我所知,没有真正的方法来阻止EditText自动获得焦点。您要求专注于RelativeLayout的方法似乎是解决此问题的最佳方案 - 即使它不是一个好的解决方案,感觉更像是一种解决方法。

我的建议是:如果可能的话尽量避免这种情况,尝试用ClickListeners来完成你需要做的事情,就像这些你不必自动处理视图一样。但是,如果没有其他解决方案,您必须意识到每次不应该收到焦点的视图都可以获得焦点时,您必须请求关注RelativeLayout。您的代码没有显示您如何处理对话框,所以我无法直接帮助您,但在这里您将找到有关对话框的所有信息:http://developer.android.com/guide/topics/ui/dialogs.html