207

EditText-Fieldがあり、OnFocusChangeListenerを設定しています。フォーカスが失われると、メソッドが呼び出され、データベース内のEditTextの値をチェックします。メソッドの戻り値がtrueの場合、トーストが表示され、フォーカスは再びEditTextに戻るはずです。メソッドの戻り値がfalseになるまで、フォーカスは常にEditTextに戻り、キーボードが表示されます。

編集:私はまだ私の本当の問題を完全に明らかにしていないと思います:EditTextの値が値に編集されるまで、画面上の他のアイテムは編集できないはずです。これにより、メソッド "checkLiganame(liganame) "falseを返します。EditText-Fieldのみを編集可能にする必要があります。

これが私のコードです(これは私には機能しません):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

と方法:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

このコードにより、次の結果が得られます。EditTextがフォーカスを失った後、フォーカスはEditTextに戻りますが、テキストを編集できなくなります。

EDIT2:コードを変更しました。シナリオ:

最初のEditTextをクリックして、すでにデータベースにある文字列をその中に入れます。トーストが表示されています。文字列を編集できなくなりました。キーボードの「次へ」をクリックすると、フォーカスは最初のEditTextに留まります。文字列を編集しようとしましたが、何も起こりません。代わりに、新しい文字列が2番目のEditTextに表示されます。デバイスの戻る矢印をクリックし、最初と2番目のEditTextを再度クリックします->キーボードが表示されません。

これが私の新しいコードです:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}
4

18 に答える 18

333

この行をあなたのonCreate()

editText.requestFocus();
于 2013-11-25T16:09:41.603 に答える
176

キーボードを表示するには、フォーカスを要求するだけでは不十分です。

フォーカスを取得してキーボードを表示するには、次のように記述します。

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

編集: checkLiganame メソッドが追加された後、回答に追加情報を追加します。

checkLiganame メソッドでは、カーソルが null かどうかを確認します。カーソルは常にオブジェクトを返すため、null のチェックは何もしません。ただし、問題は行にありますdb.close();

データベース接続を閉じると、Cursorは無効になり、ほとんどの場合 null になります。

値を取得したら、データベースを閉じます。

カーソルの null をチェックする代わりに、返された行数が 0 より大きいかどうかをチェックする必要があります: if(cursor.getCount() > 0) その場合はブール値を true に設定します。

EDIT2:これを機能させる方法のコードを次に示します。EDIT3:追加した間違ったコードを申し訳ありません... ;S

まず、別のユーザーがフォーカスを取得した場合は、フォーカスをクリアする必要がありEditTextます。これは で行うことができますmyEditText.clearFocus()。次に、 onFocusChangeListener では、最初にフォーカスがあるかどうかを気にする必要はないEditTextため、 onFocusChangeListener は次のようになります。

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

最初のチェックif(liganame.length() == 0)を独自のチェックに置き換えると、機能するはずです。onFocusChangeListener例で行ったように、すべての EditText ビューが同じリスナーに設定されている必要があることに注意してください。

于 2013-01-14T22:26:01.813 に答える
68

Darwind コードはキーボードを表示しませんでした。

これは私のために働く:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

キーボードが表示されない場合は、次のことを強制してみてください。

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
于 2015-01-03T00:10:32.133 に答える
19

これは、ボタンがクリックされたときに EditText のフォーカスを変更します。

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}
于 2014-08-05T06:03:40.307 に答える
8

EditText を動的に作成する場合は、次に示すように requestFocus() を設定する必要があります。

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

xml ビューで既にコンポーネントを宣言している場合は、それを見つける必要があり、以下のようにフォーカスできます。

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

対応する EditText コンポーネントにフォーカスのみを設定します。

于 2015-08-06T18:06:08.120 に答える
2

1 行でこれを行うことができます。

yourEditText.RequestFocusFromTouch();
于 2016-10-26T18:54:20.460 に答える
1

解決策が見つかったかどうかはわかりませんが、フォーカスを再度リクエストした後の編集の問題については、次のとおりです。

edittext1でメソッドselectAll()または(空の場合) を呼び出そうとしましたか?setSelection(0)

これが役立つかどうか教えてください。回答を編集して完全な解決策にします。

于 2013-11-28T15:16:11.203 に答える
1

で使用すると、タップ時にキーボードが表示されないという問題が発生する場合は、SingleLiveEventrequestFocus()を使用して、その中でフォーカスをリクエストします。onCreate()BindingAdapter

方法は次のとおりです。

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}
于 2019-10-02T11:59:48.300 に答える