2014-01-23 29 views
-1

我写一个Android应用程序onClickListener只有后软键盘按

我设置editText.setOnClickListener(...)

,但我看到所谓,当用户点击软键盘被打开,只有

当用户点击一个键盘键时--被调用。

如何捕捉到点击软键盘打开之前?

我想避免键盘开幕。

这里是我的代码:在调试过程中,我看到这条线被称为两次

mPhoneNumberField.setInputTextOnClickListener(new OnClickListener() {

虽然它是从的onCreate,只叫

public class PhoneLoginFillInField extends LinearLayout { 
.. 
    public void setInputTextOnClickListener(OnClickListener onClickListener) 
    { 
     mInputText.setOnClickListener(onClickListener); 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.phone_login); 
    initMembers(); 
    setOnClickListeners(); 
    initFieldsTexts(); 
    setKeyboardVisibilityListener(); 
} 

private void setOnClickListeners() { 

    mPhoneNumberField.setInputTextOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      setResult(RESULT_CANCELED); 
      finish(); 
     } 
    }); 

} 

和有setOnClickListeners();被称为

+0

所以你不想键盘打开,当你点击的EditText? –

+0

我想将用户移动到另一个视图,而不是 –

+0

能否请您发布您的代码更好地理解 –

回答

0

将onTouchListener设置为EditView。请记住返回true以避免事件传播。

+0

为什么我们没有在'公共无效的onClick(视图v)'布尔回报?你能更好地解释这个传播问题吗? –

+0

View.onTouch方法返回“如果侦听器已使用该事件,则返回true,否则返回false”。在第二种情况下,事件将被传播到视图层次结构,以便父视图可以自己处理事件。在你的情况下,你将在你的editText中使用这个事件,所以你必须在onTouch方法中返回true。 – ladu

+0

为什么我们在public void onClick(View v)中没有布尔返回? –

1

你的意思是EditText上不应该获得焦点;它只需要响应点击事件。这样做:

editText.setFocusableInTouchMode(false); 

,然后进行:

editText.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Your code... 
    } 
} 
+0

顺便说一句,当调试我看到设置onClickListener的代码被执行两次。虽然它只是从“onCreate”中调用过的。怎么来的? –

+0

不应该设置两次。如果您正在Eclipse中进行调试,并且您在设置onClickListener的位置以及按Step Over(F6)时有一个断点,则您会看到它使您保持在同一行上,因此无需担心。它只是初始化新的OnClickListener,然后将其设置为您的EditText。我认为Android Studio和InteliJ的行为是一样的。另一方面,如果它真的执行了重写onClick()方法中的代码两次,那么确实存在问题。您应该发布代码以获取更多帮助。 – Bandreid

+0

添加了我的代码。谢谢 –