如何在单击按钮时通过编程设置和删除EditText上的焦点

6

我有一个编辑框,当点击按钮时,我希望能够将焦点设置在它上面,在我编辑完状态后,当按下软键盘的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(),请检查我的答案,它有效。 - Sats
5个回答

10

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

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

当一个视图清除焦点时,框架试图将焦点给予从顶部开始的第一个可聚焦的视图。因此,如果这个视图是从顶部开始可以获取焦点的第一个视图,那么在清除焦点后所有与之相关的回调函数都会被调用,之后框架将把焦点给予这个视图。 - anshad

1
尝试这个:

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

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

1

尝试这种方式,希望这可以帮助您解决问题。

编程方式:

edittext.requestFocus();

通过XML:

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

仍然没有任何反应。 - Android
什么叫什么都没发生? - Haresh Chhelana

0

你可以将这段代码添加到 onCreate 方法中,这样每次活动启动时都会隐藏键盘。你还可以通过编程方式将焦点切换到其他项目。

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

0

使用 setFocus 方法来聚焦 EditText

editText1.setFocusable(true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接