【问题标题】:How to programmatically set and remove Focus on edit text on click of a button如何以编程方式设置和删除单击按钮时编辑文本的焦点
【发布时间】:2014-09-30 05:04:03
【问题描述】:

我有一个编辑文本,我想在单击按钮后将焦点设置在它上,并且在为软键盘按下 enter 或 done 时编辑我的状态后,我想再次移除焦点并向服务器发送请求。

这是我在 XML 中的编辑文本

<EditText
                android:id="@+id/time_statusTV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/selectIBT"
                android:layout_alignLeft="@+id/profile_name"
                android:layout_toLeftOf="@+id/add_timeline_status_IBTN"
                android:layout_toRightOf="@+id/image_profile"
                android:background="@android:color/transparent"
                android:focusable="false"
                android:maxLines="2"
                android:text="short description of \nyourself that can go\nover 2 lines."
                android:textColor="@color/text_color_gray"
                android:textSize="18sp" />

点击按钮我在做什么

case R.id.add_timeline_status_IBTN:
        time_statusTV.setFocusable(true);
        time_statusTV.requestFocus();

        break;

这是我的编辑文本键事件

time_statusTV = (EditText) rootView.findViewById(R.id.time_statusTV);
    time_statusTV.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if ((event.getAction() == KeyEvent.ACTION_DOWN)
                    && (keyCode == KeyEvent.KEYCODE_ENTER)) {

                // My code

                time_statusTV.clearFocus();
            }
            return false;
        }
    });

但是当我点击按钮时没有任何反应。

【问题讨论】:

  • 不要使用 requestFocus() 和 clearFocus() ,检查我的答案,它有效

标签: android android-edittext focus


【解决方案1】:

我认为你混淆了设置焦点和显示和隐藏键盘,所以试试我的回答:

 case R.id.add_timeline_status_IBTN:

    time_statusTV.setFocusable(true);
    time_statusTV.requestFocus();
    InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
    imm.showSoftInput( time_statusTV, 0);

并清除它:

imm.hideSoftInputFromWindow(your edittext.getWindowToken(), 0);

所以你的代码必须是这样的:

  time_statusTV = (EditText) rootView.findViewById(R.id.time_statusTV);
  time_statusTV.setOnKeyListener(new OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if ((event.getAction() == KeyEvent.ACTION_DOWN)
                && (keyCode == KeyEvent.KEYCODE_ENTER)) {


            imm.hideSoftInputFromWindow( time_statusTV.getWindowToken(), 0); 
            time_statusTV.clearFocus();
        }
        return false;
    }
});

【讨论】:

  • 当视图清除焦点时,框架试图将焦点从顶部分配给第一个可聚焦的视图。因此,如果此视图是从顶部开始获得焦点的第一个视图,则将调用所有与清除焦点相关的回调,然后框架将焦点放在此视图上。
【解决方案2】:

试试这个方法,希望能帮助你解决问题。

以编程方式:

edittext.requestFocus();

通过xml:

<EditText...>
    <requestFocus />
</EditText>

【讨论】:

  • 仍然没有任何反应
  • 什么都没有发生是什么意思?
【解决方案3】:

试试这个:

editText.setFocusable(true);// to set focus on EditText

    editText.setFocusable(false);// to remove focus from EditText

【讨论】:

    【解决方案4】:

    对 EditText 使用 setFocus

    editText1.setFocusable(true);
    

    【讨论】:

      【解决方案5】:

      您可以将其添加到 onCreate 中,它会在每次活动开始时隐藏键盘您也可以通过编程将焦点更改为另一个项目。

      this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
      

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 2016-04-03
        • 2011-03-15
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2011-12-28
        • 1970-01-01
        相关资源
        最近更新 更多