Doesn't work either, unfortunately. None of the ways mentioned above worked.
I solved this issue by adding a workaround: instead of custom setText() operation, which includes sendKeys() and hideKeyboard() calls, I simply send keys and tap "Done" button above the text field.
Still, it is a workaround. I believe the general problem is the following: if there is no "return"/"done"/"hide" button on a soft keyboard, driver hits voice input key instead.
I think it's worth mentioning it in Appium docs (that is, if there is no "return" button on a soft keyboard in particular situation, hideKeyboard() will not work). Or the method should throw an exception (e.g., "Appium driver tried to close the keyboard, but no "close" button was found, use some controls outside the keyboard to dismiss it"). Now this method does something different from what's mentioned in its name, and does it silently, no warning, no exception.