Android Edit Text Cursor Doesn't Appear

2020-08-20 08:18发布

问题:

in my app I disabled the keyboard (I use now my custom keyboard) using this code:

editText.setInputType(InputType.TYPE_NULL);

Now, my problem is that the text cursor does not appear anymore in the edit text. What should I do? Any suggestion would be very appreciated.

回答1:

There is an Issue opened in bug tracker Issue opened in bug tracker for this. One of the users suggests the approach which works on "most" devices.

Briefly, all you have to do is call:

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

for your EditText view (after you called editText.setInputType(InputType.TYPE_NULL);).

You should probably also set:

editText.setTextIsSelectable(true);

in order for text to be selectable (though in does not seem to work properly with Samsung Galaxy SIII). This method is only available starting from HONEYCOMB (api11) so keep that in mind when developing for older Android versions.

Also it is stated that your EditText should not be the first view to receive focus when activity starts (if it is - just requestFocus() from another view). Though I (personally) have not experienced any problems with this.



回答2:

Rather than just using a custom view for your custom keyboard, why not implement a full-fledged IME? That will solve your cursor problem, and even make your keyboard available outside your app (if you want).

This answer has a couple useful links if you want to do that: How to develop a soft keyboard for Android?



回答3:

I really wouldn't suggest this. Writing a good full fledged IME is really hard. In addition, users come to expect functionality from their keyboard (auto-correct, Swyping, next word prediction, the ability to change languages) that you won't have unless you spend months on the keyboard itself. Any app that wouldn't allow me to use Swype would immediately be removed (bias note: I worked on Swype android).

But if you want to integrate fully with the OS as a keyboard, you're going to have to write an InputMethodService. Your keyboard would then be selectable by the user in the keyboard select menu, and usable for any app. That's the only way to get full OS integration, otherwise you'll need to really start from scratch- writing your own EditView. Have fun with that, getting one that looks nice is decidedly non-trivial.

Also, setting input type null won't disable most keyboards. It just puts them into dumb mode and turns off things like prediction.



回答4:

I tried the below answer and it worked, but take care that 1) EditText must not be focused on initialization 2) when your orientation changes while the user's focus is on the editText, the stock keyboard pops up, which is another "solvable" problem.

This was mentioned in a previous answer but take care that you MUST make sure your editText element do not get focus on instantiation:

https://code.google.com/p/android/issues/detail?id=27609#c7

#7 nyphb...@gmail.com

I have finally found a (for me) working solution to this.

First part (in onCreate):

mText.setInputType(InputType.TYPE_NULL);
if (android.os.Build.VERSION.SDK_INT >= 11 /*android.os.Build.VERSION_CODES.HONEYCOMB*/) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

In addition, android:textIsSelectable needs to be set to true (or set in onCreate) and the EditText must not be focused on initialization. If your EditText is the first focusable View (which it was in my case), you can work around this by putting this just above it:

<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>