2013-02-12 14 views
5

見つかり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動作を無効にしたくありません。私は、ユーザーが領域選択を行うことができるようにしたい(コピー&ペースト用)。私はおそらくそれがフォーカスを得るために(物理的なキーボードを持つ人々がアプリケーションを使用するとき、私はモデルを壊すことはありません)。そして、クリックがカーソル位置を設定しても構いません。したがって、onTouchをオーバーライドし、EditTextのすべてのonTouchアクションをブロックするソリューションは、私のためには機能しません。

更新日私はもう少し発見しました。 EditTextがフォーカスを得ている場合、onFocusChangeが呼び出され、onClickは呼び出されません。既にフォーカスがある場合、onClickは呼び出され、onFocusChangeは呼び出されません。第二に、それはonFocusChangeにそう

setInputType (InputType.TYPE_NULL); 

を呼び出すことにより、キーボードを非表示にすることも可能

をの作品 - キーボードが現れることはありません。 onClick(キーボードがクリックされる前に隠れていることを前提としています)は明らかに遅すぎます - キーボードが現れて消えます。

次のアイデアは、オンタッチ時にキーボードを非表示にすることです。しかし、私はそのコードを混乱させるのが怖いです - 私が理解していることは、将来のバージョンのEditTextに関しては非常に壊れやすいと思われます。

これについて何か考えていますか?

答えて

1

を必要に応じて条件にuはダイアログを表示することができu.first時間を助けることができる場合は、これを試してください、ここでは2つの作業のソリューションです!私は2つのデバイス(Nexus 7は4.2.1、Kyocera C5170は4.0.4)でテストしました。私の好みは、解決策2です。最初の場合

SOLUTION 1

のEditTextはそれが仕事だ行う機会がある前に、トリックは、onTouchの代わりのonClickのカーソル位置を決定することであった - それは、キーボードをポップアップ特に前に。

コメントが1つ追加されました:ポップアップのマニフェストにandroid:windowSoftInputMode = "stateHidden"を設定してください。そうしないと、キーボードがポップアップに表示されます。

はここで全体のコードです:

public class ClickText extends EditText implements OnTouchListener 
{ 
    public ClickText (Context context, AttributeSet attrs) 
    { 
    super (context, attrs); 
    setOnTouchListener (this); 
    } 

    @Override 
    public boolean onTouch (View v, MotionEvent event) 
    { 
    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) 
    { 
     int line = getLayout().getLineForVertical ((int)event.getY()); 
     int onTouchCursorPos = getLayout().getOffsetForHorizontal (line, event.getX()); 
     if (onTouchCursorPos < 10) // or whatever condition 
     showPopup (this); // or whatever you want to do 
    } 
    return false; 
    } 

    private void showPopup (final EditText text) 
    { 
    Intent intent = new Intent (getContext(), Popup.class); 
    ((Activity)getContext()).startActivity (intent); 
    } 
} 

SOLUTION 2

この1つは実際には単純であると、私は考えて、良いです - 副作用が少ないです。

ここでは、EditTextにすべてのクリック処理をさせて、それを非同期的にオーバーライドさせるという方法があります。要点は次のとおりです。タッチを「離してください」(MotionEvent.ACTION_UP)まで待ってから、すぐにアクションを実行する代わりに、イベントキューにRunnableをポストしてアクションを実行します。

全体コード:

public class ClickText extends EditText implements OnTouchListener 
{ 
    public ClickText (Context context, AttributeSet attrs) 
    { 
    super (context, attrs); 
    setOnTouchListener (this); 
    } 

    @Override 
    public boolean onTouch (View v, MotionEvent event) 
    { 
    switch (event.getActionMasked()) 
    { 
     case MotionEvent.ACTION_UP: 
     { 
     post (new Runnable() 
     { 
      // Do this asynch so that EditText can finish setting the selectino. 
      @Override 
      public void run() 
      { 
      int selStart = getSelectionStart(); 
      int selEnd = getSelectionEnd(); 

      // If selStart is different than selEnd, user has highlighed an area of 
      // text; I chose to ignore the click when this happens. 
      if (selStart == selEnd) 
       if (selStart >= 0 && selStart < 10) // or whatever range you want 
       showPopup (this); 
      }    
     }); 

     break; 
     } 
    } 

    return false; 
    } 

    private void showPopup (final EditText text) 
    { 
    Intent intent = new Intent (getContext(), Popup.class); 
    ((Activity)getContext()).startActivity (intent); 
    } 
} 
2

が、これは

EditText e = new EditText(context); 
    e.setOnFocusChangeListener(new OnFocusChangeListener() { 

     public void onFocusChange(View v, boolean hasFocus) { 
      // TODO Auto-generated method stub 
     if(hasFocus) 
     { 
      //dialogue popup 
     } 
     } 
    }); 

を働かせることができるであってもよいし、Uはe.hasFocus();を使用し、それが

///////////////私のコードを非フォーカス作るためにe.setFocusable(false);を使用することができます

e.setInputType(InputType.TYPE_NULL); 

e.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     AlertDialog.Builder sa = new Builder(ctx); 
     sa.create().setOnDismissListener(new OnDismissListener() { 

      public void onDismiss(DialogInterface dialog) { 
       // TODO Auto-generated method stub 
       e.setInputType(InputType.TYPE_CLASS_TEXT); 
      } 
     }); 
     sa.show(); 
    } 
}); 
+0

は、あなたが何を考えていると、わずかな洞察を提供してもらえますか?ありがとう。 –

+0

最初にe.setFocusable(false)でフォーカスをfalseに設定し、onclick関数でダイアログを表示した後にフォーカスできるようにするため、ポップアップは期待どおりに進みます –

+0

大きな違いはありません。それはまだ最初に失敗し、その後のタップでキーボードをポップアップします。私はダイアログを作成する呼び出しの周りにsetFocusable呼び出しをすぐに配置します。 –

2

this.editText.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
           //dialogue popup 
      } 
      return false; 
     } 
    }); 
をonTouchするためのonClick試しチェンジ・キャプチャ・クリック
+0

これを試してみてください。 onTouchで何かをすることは可能かもしれませんが、それは非常に難しいようです。あなたが提案したことをすることは、getSelectionStartを破ることです - 私はカーソル位置が設定される前にonTouchが起こっていることを確信しています。 –

+0

あなたの提案をお寄せいただき、ありがとうございました。あなたのためにUpvote。 –

1

それはのEditTextが通常editttextとして動作し、実験をたくさんした後

EditText editText; 
mTim_edittext.setOnFocusChangeListener(new OnFocusChangeListener() { 

     public void onFocusChange(View v, boolean hasFocus) { 

    if(!hasFocus){ 

    //statement 


if(condition){ 

AlertDialog diaBox = Utils.showErrorDialogBox( "Term in Months Cannot be 0", context);        
diaBox.show(); 
       } 


      } 
     } 
    }); 
+0

あなたの提案をお寄せいただき、ありがとうございました。あなたのためにUpvote。 –

+0

私の喜び@Peri Hartman – chinmaya

0

このコードスニペット以下の使用

this.editText.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
           //dialogue popup 
      } 
      return false; 
     } 
    }); 
関連する問題