6

我的情况是:我有一个带有禁用焦点的 EditText 字段。在 EditText 字段旁边,我有两个用于输入法的按钮。所以我想在单击第一个按钮时:打开软键盘并在 EditText 字段中编辑文本。我尝试了很多方法:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

对我不起作用。打开软键盘的唯一方法是:

toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

但无法从 EditText 字段中编辑信息。

您能否建议我在单击按钮时如何打开键盘并编辑某些 EditText 的文本。非常感谢!

编辑:

因此,默认情况下 EditText 不可聚焦。当我单击键盘按钮时 - 应该是可聚焦的,然后显示软键盘以输入文本并出现在 EditText 中。其他插入方法是不需要键盘的 ABC 按钮。这将类似于摩尔斯电码输入 - 触摸并按住 ABC 按钮 :) 我将尝试建议的示例以在我的情况下实现。谢谢你们 :)

我的情况

4

7 回答 7

22

谢谢大家的帮助:)我使用了你给我的所有建议,搜索并测试了很多其他脚本,最后我的代码正在运行:)

这是我的最终代码:

InputEditText = (EditText) findViewById(R.id.InputText);

public void InputData() {

        /* Keyboard Button Action */
        KeyboardButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Log.v(TAG, "On Keyboard Button click event!");

                InputEditText.requestFocus();
                InputEditText.setFocusableInTouchMode(true);

                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(InputEditText, InputMethodManager.SHOW_FORCED);

            }

        });

}

它可能对某人有用:) 谢谢!

于 2013-02-12T13:53:33.323 回答
13

不推荐您描述的设计。您违反了focusable属性的目的,即不控制用户是否可以更改EditText组件中的文本。

如果您计划提供替代输入法,因为用例似乎需要这样做(例如,您只允许可编辑文本字段中的特定符号集),那么您可能应该在不允许用户的时间内完全禁用文本编辑更改字段的值。

声明您的可编辑字段:

<EditText
    android:id="@+id/edit_text_2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" />

请注意,它的focusable属性保留了默认值。没关系,我们稍后会处理。声明一个将开始编辑过程的按钮:

<Button
    android:id="@+id/button_show_ime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start editing" />

现在,在您的Activity声明中:

private EditText editText2;
private KeyListener originalKeyListener;
private Button buttonShowIme;

onCreate()这样做:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ime_activity);

    // Find out our editable field.
    editText2 = (EditText)findViewById(R.id.edit_text_2);
    // Save its key listener which makes it editable.
    originalKeyListener = editText2.getKeyListener();
    // Set it to null - this will make the field non-editable
    editText2.setKeyListener(null);

    // Find the button which will start editing process.
    buttonShowIme = (Button)findViewById(R.id.button_show_ime);
    // Attach an on-click listener.
    buttonShowIme.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Restore key listener - this will make the field editable again.
            editText2.setKeyListener(originalKeyListener);
            // Focus the field.
            editText2.requestFocus();
            // Show soft keyboard for the user to enter the value.
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText2, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // We also want to disable editing when the user exits the field.
    // This will make the button the only non-programmatic way of editing it.
    editText2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // If it loses focus...
            if (!hasFocus) {
                // Hide soft keyboard.
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(editText2.getWindowToken(), 0);
                // Make it non-editable again.
                editText2.setKeyListener(null);
            }
        }
    });
}

我希望带有所有注释的代码是不言自明的。在 API 8 和 17 上测试。

于 2013-02-11T18:09:08.120 回答
5

试试这个 :

        final EditText myedit2 = (EditText) findViewById(R.id.myEditText2);

        Button btsmall = (Button) findViewById(R.id.BtSmall);
        btsmall.setOnClickListener(new OnClickListener() {              
            @Override
            public void onClick(View arg0) {
                myedit2.requestFocus();
            }
        });
于 2013-02-11T16:20:40.963 回答
1

我已经使用此代码在单击按钮时打开键盘。像 。

btn1 = (Button) findViewById(R.id.btn1);
edt1 = (EditText) findViewById(R.id.edt1);
btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            edt1.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(edt1, InputMethodManager.SHOW_IMPLICIT);
        }
    });

其完成的工作。

于 2015-08-01T16:30:21.350 回答
1
LinearLayout ll_about_me =(LinearLayout) view.findViewById(R.id.ll_about_me);
    ll_about_me.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub

            mEtEmpAboutYou.requestFocus();
            mEtEmpAboutYou.setFocusableInTouchMode(true);

            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(mEtEmpAboutYou, InputMethodManager.SHOW_FORCED);

            return true;
        }
    });
于 2016-04-27T10:34:57.957 回答
1

对于那些使用片段的人,您可以使用InputMethodManager这种方式:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
            }

完整代码:

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                editText.setFocusable(true);
                editText.setFocusableInTouchMode(true);
                editText.requestFocus();
                InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
                }
            }
        });
于 2018-04-22T08:45:54.527 回答
0

我希望这有帮助

EditText txt_categorie = findViewById(R.id.txt_categorie);
txt_categorie.requestFocus();
于 2019-12-03T09:26:39.673 回答