1

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>
4

3 に答える 3

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;

    }

    });



}
于 2013-04-09T10:45:02.333 に答える
2

ボタンはレイアウトにバインドされていません:

buttonLogin.performClick();

ここで NPE を取得します。これを後に追加しますsetContentView

        buttonLogin = (Button) findViewById(R.id.your_button_id);
于 2013-04-09T10:42:28.317 に答える
1

これが古い投稿であることは承知していますが、この問題の背後にある理由を明確にして、人々が修正だけでなく理由を理解できることを願っています.

実行可能な重要なイベント

OnEditActionListenerは、KeyEvent.ACTION_DOWN イベントではなく、特定のアクション可能なイベントをリッスンします。歴史的には、SoftIME (仮想キーボード) のアクション可能なボタン、つまり検索、次へ、または改行ボタンに使用されており、その実装はその使用法に合わせて調整されています。

ハードウェア キー イベント

OnKeyListenerは、特定のキー エントリ、または KeyEvent.KEYCODE_DPAD_UP、KeyEvent.KEYCODE_BACK、KeyEvent.KEYCODE_BOOKMARK などの特別なキー イベントに使用できます。ただし、ハードウェア キーボード イベントにのみ使用されます。

リアルタイムのテキスト変更 ハード/ソフト キーボード

TextView/EditText 全体に対するイベント変更の場合、編集可能領域が変更されるたびにトリガーされるTextWatcherを使用できます。少し変更すると、特定の文字の変更をフックして確認できます。

なぜ

OnEditActionListener はアクション可能なイベントをリッスンしおり、ビュー階層システム コールバックにフックすることでこれを行っています。これは、フレームワークの待機時間と、イベントが子コールバックにどのように伝達されるかによって、一部のイベントが到達した時点で既に消費されている可能性があることを意味します。

イベントが null であるかどうかに関係なく、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;
        }
    });
于 2016-05-08T10:37:09.107 に答える