web-dev-qa-db-ja.com

Android imeOptions = "actionDone"が機能していません

Androidアプリのログイン画面を取得しようとしていますが、これまでのところこれは私のコードです:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">


    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:orientation="vertical">

        <EditText
            Android:id="@+id/username"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="Username"
            Android:inputType="text"
            Android:singleLine="true"
            Android:imeOptions="actionNext">

            <requestFocus />
        </EditText>

        <EditText
            Android:id="@+id/password"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="Password"
            Android:inputType="textPassword"
            Android:singleLine="true"
            Android:imeOptions="actionDone"  />

        <Button
            Android:id="@+id/buttonLaunchTriage"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="1"
            Android:text="@string/login" />
    </LinearLayout>



</RelativeLayout>

実行しようとすると、キーボードに正しいキーが表示されますが、パスワードを入力した後に完了キーを押しても何も起こりません。私はこれを使用してボタンを押します:

private void setupLoginButton() {
    Button launchButton = (Button) findViewById(R.id.buttonLaunchTriage);
    launchButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            EditText username = (EditText) findViewById(R.id.patient_start_userName_value);
            EditText password = (EditText) findViewById(R.id.patient_start_password_value);

            try {
                if(TriageApplicationMain.validateUser(username.getText().toString(),password.getText().toString(),getApplicationContext()))
                {
                Toast.makeText(StartActivity.this,
                        "Launching Triage Application", Toast.LENGTH_SHORT)
                        .show();
                startActivity(new Intent(StartActivity.this, MainActivity.class));
                }

                else
                     {
                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                            StartActivity.this);


                        // set dialog message
                        alertDialogBuilder
                            .setMessage("Incorrect Credentials")
                            .setCancelable(false)
                            .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    // if this button is clicked, close
                                    // current activity
                                dialog.cancel();    
                                }
                              });


                            // create alert dialog
                            AlertDialog alertDialog = alertDialogBuilder.create();

                            // show it
                            alertDialog.show();

                    }
                }


            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

}

これは大量のコードであることは知っていますが、ここで誰かが私を助けてくれたら素晴らしいと思います。これは学校プロジェクト用です。

PS:これを投稿する前にGoogleでしっかりと検索したので、そうしないことを批判しないでください。役立つリンクを見つけたら、共有してください。

31
Mak

Android:inputType="..." EditTextに。それが動作します!! :)

55
Oat Anirut

ユーザーがキーボードの「完了」をクリックしたときに実行するアクションを実装するには、EditTextにOnEditorActionListenerを設定する必要があります。

したがって、次のようなコードを記述する必要があります。

password.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // Do whatever you want here
            return true;
        }
        return false;
    }
});

Androidデベロッパーサイト のチュートリアルを参照してください

41
Qianqian

Qianqianは正しいです。コードは、EditorActionイベントではなく、ボタンクリックイベントのみをリッスンします。

一部の電話ベンダーは、DONEアクションを適切に実装できない可能性があることを付け加えます。たとえば、これをLenovo A889でテストしましたが、その電話はEditorInfo.IME_ACTION_DONEdoneを押すと、常にEditorInfo.IME_ACTION_UNSPECIFIEDだから私は実際に次のようなもので終わる

myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event)
  {
    boolean handled=false;

    // Some phones disregard the IME setting option in the xml, instead
    // they send IME_ACTION_UNSPECIFIED so we need to catch that
    if(EditorInfo.IME_ACTION_DONE==actionId || EditorInfo.IME_ACTION_UNSPECIFIED==actionId)
    {
      // do things here

      handled=true;
    }

    return handled;
  }
});

「処理済み」フラグにも注意してください(Qianqianはその部分を説明しませんでした)。上位の他のOnEditorActionListenersが異なるタイプのイベントをリッスンしている可能性があります。メソッドがfalseを返す場合、それはこのイベントを処理しなかったことを意味し、他のユーザーに渡されます。 trueを返した場合、それを処理/消費したことを意味し、他の人に渡されません。

23
peedee

つかいます Android:inputType="Yours"その後

Android:lines="1"
Android:imeOptions="actionDone"
9
influx

多くのことを試した後、これは私のために働いたものです:

    Android:maxLines="1"
    Android:inputType="text"
    Android:imeOptions="actionDone"
2
Jeremy Freeley

ユーザーがキーボードの「完了」をクリックしたときに実行するアクションを実装するには、EditTextにOnEditorActionListenerを設定する必要があります。

1
Harsha Sharma

これをあなたの属性に追加してください:

Android:inputType="textPassword"

Doc: ここ

0
Ali Alp