首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MaterialDatePicker和TextInputLayout的安卓系统

使用MaterialDatePicker和TextInputLayout的安卓系统
EN

Stack Overflow用户
提问于 2020-03-16 17:28:34
回答 3查看 4.2K关注 0票数 4

我是android开发的新手,目前正在尝试将材料设计集成到我的应用程序中。我想评估一个简单的表单,为此,我使用了组件com.google.android.material.textfield.TextInputLayoutcom.google.android.material.textfield.TextInputEditText作为用户输入。除了文本输入,我需要一个日期,我想用一个MaterialDatePicker阅读。

我试图用MaterialDatePicker显示OnFocusChangeListener,但我有两个问题。

显示有点延迟,因为首先打开一个键盘,它在调用MaterialDatePicker.

  • when后立即关闭,显示用后退按钮关闭,焦点仍然放在TextInputLayout上。因此,我必须首先更改焦点,才能再次打开MaterialDatePicker

这就是我实现OnFocusChangeListener的方式

代码语言:javascript
复制
@Override
public void onFocusChange(View view, boolean selected) {

    if( view.getId() == R.id.myId&& selected ){

        MaterialDatePicker.Builder builder = MaterialDatePicker.Builder.datePicker();
        MaterialDatePicker picker = builder.build();
        picker.show( this.getParentFragmentManager(), "DATE_PICKER" );
    }
}

材料设计中是否有更适合于演示的替代组件?我希望将行为保存在表单中,因此一旦用户输入日期,就应该在上面显示一个小标签,如下所示:

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-01 19:47:08

我最近也遇到了同样的问题。

关于键盘的第一个问题是通过调用:

代码语言:javascript
复制
mTextInputEditText.setInputType(InputType.TYPE_NULL);

通过将InputType设置为TYPE_NULL,键盘将不会通过单击文本字段打开。此外,如果您不再希望用户能够输入任何文本,则可以添加:

代码语言:javascript
复制
mTextInputEditText.setKeyListener(null);

第二个问题是,为了在DatePicker已经有焦点的情况下再次显示它,可以设置一个额外的onClickListener:

代码语言:javascript
复制
mTextInputEditText.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                openDatePicker();
            }
        });

当用户再次单击文本字段时,将立即调用OnClickListener。遗憾的是,它不能在第一次点击时工作。您可以查看这个答案https://stackoverflow.com/a/11799891/9612595以获得更多信息。不幸的是,使文本字段不可聚焦就会产生奇怪的行为,并从材料中得到提示。

我希望这能帮上忙!

票数 5
EN

Stack Overflow用户

发布于 2021-08-26 05:25:32

添加到luk321答案。而不是OnClickListener,您可以使用OnTouchListener。对前-

代码语言:javascript
复制
editText.setOnTouchListener((view, motionEvent) -> {
     if(motionEvent.getAction() == MotionEvent.ACTION_UP){
        //your code                
     }
     return false;
});

它将在第一次接触时起作用。确保使用ACTION.UP,否则事件将在滚动时发生。

票数 2
EN

Stack Overflow用户

发布于 2021-11-02 19:24:24

代码语言:javascript
复制
deliverDatePicker.editText?.setOnClickListener {
    viewModel.onDatePickerClick()
}
deliverDatePicker.editText?.setOnFocusChangeListener { _, hasFocus ->
    if (hasFocus) {
        viewModel.onDatePickerClick()
    }
}

覆盖setOnFocusChangeListener和setOnClickListener解决了@luk321 321应答的第一个未注册单击事件

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60710536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档