2 つの解決策が見つかりました - 選択した回答を参照してください
ユーザーが EditText の特定の領域をクリックすると、ダイアログが表示されます。クリックをキャプチャするために onClick を使用しました。これは部分的に機能します。ユーザーが EditText を初めてタップすると、ソフト キーボードがポップアップしますが、ダイアログはポップアップしません。続けてタップすると、キーボードが表示され、次にダイアログが表示されます (キーボードは消えます)。
これは、EditText がフォーカスを得ることと関係があると思われます。
コードスニップは次のとおりです。
public class PrefixEditText extends EditText implements TextWatcher, OnClickListener
{
public PrefixEditText (Context context)
{
super (context);
setOnClickListener (this);
}
@Override
public void onClick(View v)
{
int selStart = getSelectionStart();
if (selStart < some_particular_pos)
bring_up_dialog();
}
}
重要: 通常の EditText の動作を完全に無効にしたくありません。ユーザーが地域を選択できるようにしたい (コピー & ペースト用)。おそらく、まだフォーカスを当てたいと思っています(物理キーボードを使用しているユーザーがアプリを使用するときにモデルを壊さないようにします)。クリックでカーソル位置を設定してもOKです。したがって、onTouch をオーバーライドして EditText からのすべての onTouch アクションをブロックするソリューションは、私にとってはうまくいきません。
更新 私はもう少し発見しました。EditText がフォーカスを取得している場合、onFocusChange が呼び出されますが、onClick は呼び出されません。既にフォーカスがある場合、onClick が呼び出されますが、onFocusChange は呼び出されません。
次に、呼び出してキーボードを非表示にすることができます
setInputType (InputType.TYPE_NULL);
onFocusChange でこれを行うと、キーボードが表示されなくなります。onClick でこれを行うのは (クリックする前にキーボードが非表示になっていると仮定して) 明らかに遅すぎます - キーボードが表示されてから消えます。
次に試すアイデアは、onTouch 中にキーボードを非表示にすることです。しかし、私はそのコードを台無しにすることを恐れています - 私が理解したことは、EditTextの将来のバージョンに関して非常に壊れやすいようです.
これについて何か考えはありますか?