如何在android中单击edittext时显示自定义键盘

时间:2014-09-11 11:29:11

标签: android android-edittext android-softkeyboard

我的应用程序中有一个自定义键盘。问题是如何在点击edittext时使用这个键盘。我使用setonfocuschangre监听器,现在当edittext焦点改变时出现custon keyboaed。但是我想在我点击edittext时显示这个键盘。我忘记了一个信息在这里放置edittext是在片段内。

6 个答案:

答案 0 :(得分:8)

我使用Keyboard标签在我的应用程序中创建了自定义键盘。我在屏幕上的RelativeLayout中添加了这个键盘,如。

private void createCustomKeyboard() {
  Keyboard customKeyboard = new Keyboard(getActivity(), R.layout.keyboard);
  CustomKeyboard mCustomKeyboard = new CustomKeyboard(getActivity(), this);
  mCustomKeyboard.setKeyboard(customKeyboard);
  RelativeLayout relLayKeyboard.addView(mCustomKeyboard);  
} 

如果您想在一个或多个EditText上使用此CustomKeyboard,则必须使用以下代码:

EditText edtxtName = (EditText) v.findViewById(R.id.edtName);
RelativeLayout relLayKeyboard = (RelativeLayout)findViewById(R.id.relLay_keyboard);
edtxtName.setOnTouchListener(exitSoftKeyBoard);

private final OnTouchListener exitSoftKeyBoard = new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
    InputMethodManager imm = (InputMethodManager) getActivity().getApplicationContext().getSystemService(
            android.content.Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    if(v.equals(edtxtName)){
        edtxtName.requestFocus();
        relLayKeyboard.setVisibility(View.VISIBLE);
    } 
    return true;
  }
};

答案 1 :(得分:4)

您可以尝试这样的事情

    edittext.setOnClickListener(new OnClickListener() {
                    // NOTE By setting the on click listener, we can show the custom keyboard again,
                   // by tapping on an edit box that already had focus (but that had the keyboard hidden).
                    @Override public void onClick(View v) {
                        showCustomKeyboard(v);
                    }
          });


          // Disable standard keyboard hard way
          // NOTE There is also an easy way: 'edittext.setInputType(InputType.TYPE_NULL)' 
         // (but you will not have a cursor, and no 'edittext.setCursorVisible(true)' doesn't work )
                edittext.setOnTouchListener(new OnTouchListener() {
                    @Override public boolean onTouch(View v, MotionEvent event) {
                        EditText edittext = (EditText) v;
                        int inType = edittext.getInputType();       // Backup the input type
                        edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
                        edittext.onTouchEvent(event);               // Call native handler
                        edittext.setInputType(inType);              // Restore input type
                        return true; // Consume touch event
                    }
                });


        // Disable spell check (hex strings look like words to Android)
        edittext.setInputType(edittext.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

有关详情,请查看here

答案 2 :(得分:1)

使用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);禁用默认键盘,然后设置点击监听器以显示您自己的键盘

答案 3 :(得分:1)

启动您的编辑文本的 InputConnection ,并创建在使用任何用户操作执行自定义键盘视图时删除和输入文本的方法。

对活动inputConnection方法声明onCreate,如下所示;

InputConnection inputConnection = editText.onCreateInputConnection(new EditorInfo());

输入任何文本时,请执行以下代码。

inputConnection.commitText(text, 1);

当您点击清除/退格按钮时,执行以下代码。

if (TextUtils.isEmpty(inputConnection.getSelectedText(0))) {
    inputConnection.deleteSurroundingText(1, 0);
} else {
    inputConnection.commitText("", 1);
}

答案 4 :(得分:0)

使用onClickListener,如下所示:

edit_text.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
        custom_keyboard.open();
    }
});

或者你可以这样做:

edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
                custom_keyboard.open();
            else
                custom_keyboard.close();
        }
    });

答案 5 :(得分:0)

您实际上可以为 CustomKeyBoard 创建 InputConnection ,然后将此连接设置为 EditText

使用InputConnection,您的CustomKeyBoard将替换android键盘并默认运行。

您可以从此处获取代码: https://medium.com/@ssaurel/creating-an-in-app-keyboard-for-your-android-apps-a0a6c6e1e289

keyboard.xml:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1"/>

        <Button
            android:id="@+id/button_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="2"/>

        <Button
            android:id="@+id/button_3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="3"/>

        <Button
            android:id="@+id/button_4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="4"/>

        <Button
            android:id="@+id/button_5"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="5"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_6"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="6"/>

        <Button
            android:id="@+id/button_7"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="7"/>

        <Button
            android:id="@+id/button_8"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="8"/>

        <Button
            android:id="@+id/button_9"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="9"/>

        <Button
            android:id="@+id/button_0"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="0"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="Delete"/>

        <Button
            android:id="@+id/button_enter"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:text="Enter"/>

    </LinearLayout>

</merge>

MyKeyBoard.java:

public class MyKeyboard extends LinearLayout implements View.OnClickListener {

private Button button1, button2, button3, button4,
                button5, button6, button7, button8,
                button9, button0, buttonDelete, buttonEnter;

private SparseArray<String> keyValues = new SparseArray<>();
private InputConnection inputConnection;

public MyKeyboard(Context context) {
    this(context, null, 0);
}

public MyKeyboard(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public MyKeyboard(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
    LayoutInflater.from(context).inflate(R.layout.keyboard, this, true);
    button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(this);
    button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(this);
    button3 = (Button) findViewById(R.id.button_3);
    button3.setOnClickListener(this);
    button4 = (Button) findViewById(R.id.button_4);
    button4.setOnClickListener(this);
    button5 = (Button) findViewById(R.id.button_5);
    button5.setOnClickListener(this);
    button6 = (Button) findViewById(R.id.button_6);
    button6.setOnClickListener(this);
    button7 = (Button) findViewById(R.id.button_7);
    button7.setOnClickListener(this);
    button8 = (Button) findViewById(R.id.button_8);
    button8.setOnClickListener(this);
    button9 = (Button) findViewById(R.id.button_9);
    button9.setOnClickListener(this);
    button0 = (Button) findViewById(R.id.button_0);
    button0.setOnClickListener(this);
    buttonDelete = (Button) findViewById(R.id.button_delete);
    buttonDelete.setOnClickListener(this);
    buttonEnter = (Button) findViewById(R.id.button_enter);
    buttonEnter.setOnClickListener(this);

    keyValues.put(R.id.button_1, "1");
    keyValues.put(R.id.button_2, "2");
    keyValues.put(R.id.button_3, "3");
    keyValues.put(R.id.button_4, "4");
    keyValues.put(R.id.button_5, "5");
    keyValues.put(R.id.button_6, "6");
    keyValues.put(R.id.button_7, "7");
    keyValues.put(R.id.button_8, "8");
    keyValues.put(R.id.button_9, "9");
    keyValues.put(R.id.button_0, "0");
    keyValues.put(R.id.button_enter, "\n");
}

@Override
public void onClick(View view) {
    if (inputConnection == null)
        return;

    if (view.getId() == R.id.button_delete) {
        CharSequence selectedText = inputConnection.getSelectedText(0);

        if (TextUtils.isEmpty(selectedText)) {
            inputConnection.deleteSurroundingText(1, 0);
        } else {
            inputConnection.commitText("", 1);
        }
    } else {
        String value = keyValues.get(view.getId());
        inputConnection.commitText(value, 1);
    }
}

public void setInputConnection(InputConnection ic) {
    inputConnection = ic;
}

}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ssaurel.inappkeyboard.MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#c9c9f1"
        android:layout_margin="50dp"
        android:padding="5dp"
        android:layout_alignParentTop="true"
        />

    <com.ssaurel.inappkeyboard.MyKeyboard
        android:id="@+id/keyboard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        />

</RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {

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

        EditText editText = (EditText) findViewById(R.id.editText);
        MyKeyboard keyboard = (MyKeyboard) findViewById(R.id.keyboard);
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);

        InputConnection ic = editText.onCreateInputConnection(new EditorInfo());
        keyboard.setInputConnection(ic);
    }
}