我在Android项目中按Enter键时出现NullPointerException。我谷歌它,人们有同样的问题,因为他们没有设置findViewByIt。不幸的是我明白了。发生了什么 - 为什么我有例外?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_page);
textPassword = (EditText) findViewById(R.id.editText1);
buttonLogin = (Button) findViewById(R.id.button1);
buttonLogin.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
PrintToast(textPassword.getText().toString());
}
});
textPassword.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
try
{
if ((event.getAction() == KeyEvent.ACTION_DOWN))
{
buttonLogin.performClick();
}
}
catch ( Exception e) {
PrintToast(e.toString());
}
return false;
}
});
}
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:gravity="top"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainPage" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="15dp"
android:text="@string/PIN_label_HelloMsg"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginTop="35dp"
android:text="@string/PIN_button_AcceptPIN" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:text="@string/PIN_label_EnterPIN"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:ems="10"
android:inputType="numberPassword" >
<requestFocus />
</EditText>
</RelativeLayout>
答案 0 :(得分:4)
试试这个
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_page);
textPassword = (EditText) findViewById(R.id.editText1);
buttonLogin = (Button) findViewById(R.id.button1);
textPassword.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
try
{
if ((event.getAction() == KeyEvent.ACTION_DOWN))
{
buttonLogin.performClick();
}
}
catch ( Exception e) {
PrintToast(e.toString());
}
return false;
}
});
[编辑] 这很好用
Button buttonLogin;
EditText textPassword ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textPassword = (EditText) findViewById(R.id.editText1);
buttonLogin = (Button) findViewById(R.id.button1);
buttonLogin.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(MainActivity.this, textPassword.getText().toString(), Toast.LENGTH_LONG).show();
}
});
textPassword.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// do your stuff here
buttonLogin.performClick();
Log.e("Called","Called OKKKKKK");
return true;
}
Log.e("Called","Called");
return false;
}
});
}
答案 1 :(得分:2)
按钮未绑定到您的布局:
buttonLogin.performClick();
在这里你得到了NPE。
在setContentView
:
buttonLogin = (Button) findViewById(R.id.your_button_id);
答案 2 :(得分:0)
我知道这是一篇很老的帖子,但我想澄清这个问题背后的原因,希望人们能够理解为什么而不仅仅是修复。
可执行的关键事件
OnEditActionListener正在侦听特定的可操作事件,而不是KeyEvent.ACTION_DOWN事件。从历史上看,它一直用于SoftIME(虚拟键盘)上的可操作按钮,即搜索,下一个或换行按钮,其实现方式适用于该用途。
硬件关键事件
OnKeyListener可用于特定键输入或特殊键事件,如KeyEvent.KEYCODE_DPAD_UP,KeyEvent.KEYCODE_BACK或KeyEvent.KEYCODE_BOOKMARK。但是,它仅用于硬件键盘事件。
实时文字更改硬/软键盘
对于整个TextView / EditText的事件更改,您可以使用TextWatcher,每次修改可编辑区域时都会触发该bootstrap web site.。稍加修改,您可以挂钩并检查特定的字符更改。
为什么
OnEditActionListener正在侦听可操作的事件,并且是通过挂钩到视图层次结构系统回调来实现的。这意味着,根据框架的延迟以及事件如何传播到子回调,某些事件可能在他们到达我们时已被消耗。
无论事件是否为空,我们仍然能够通过actionId检查操作(也就是说,我假设为什么给它)。
TCA的回答是正确的,但我会添加我的实现只是为了彻底性并添加一些额外内容。
textPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
switch( actionId ) {
case EditorInfo.IME_ACTION_DONE:
// clear textPassword focus and hide SoftIME
textPassword.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(textPassword.getWindowToken(), 0);
// call buttonLogin OnClickListener through performClick, if it exists
buttonLogin.performClick();
break;
}
return true;
}
});