EditTextにフォーカスを設定


177

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();
        }
    }
}

以下の回答が役に立った場合は、回答の1つを受け入れてください
Akshatha Srinivas 2017

回答:


276

この行をあなたの onCreate()

editText.requestFocus();

それは私のために働きます、それが役に立てば幸いです


163

フォーカスを要求するだけでは、キーボードを表示するのに十分ではありません。

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

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)を独自のチェックに置き換えると、機能するはずです。すべてのEditTextビューはonFocusChangeListener、例で行ったように、同じリスナーに設定する必要があることに注意してください。


今までありがとうございました。しかし、これは私の問題全体を解決しません。問題の説明を編集しました。
erdalprinz 2013年

では、checkLiganameは正確に何をしているのでしょうか?なぜif(liganame.isEmpty())だけをチェックできず、trueの場合、もう一度requestFocusできないのですか?
ダーウィンド2013年

1
ありがとうございます:-)これで私のメソッドは正しく動作します:-)しかし、EditText-Fieldに関する私の主な問題はまだ解決されていません。メソッドが行を見つけた後でも、それを編集することはできません...
erdalprinz 2013年

したがって、if(myEditText.requestFocus()){getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);を追加しました。onFocusChangedリスナーの内部?
ダーウィンド2013年

はい、そうしました。Liganame.requestFocus();の下。キーボードの「次へ」をクリックして、次のEditText-Fieldにジャンプします。トーストが表示され、焦点は両方のEditText-Fieldsにあります。ただし、編集できるのは2番目のものだけです。この場合、フォーカスを持つ唯一のはずの最初のものは編集できなくなります。
erdalprinz 2013年

59

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

これは私にとってはうまくいきます:

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

キーボードが表示されない場合は、強制的に実行してください。

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

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();
            }
        });
    }
}

16

これは私から働きます:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

隠れる:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
なぜ200ミリ秒待つ必要があるのですか?それは必要ですか、それともすぐに表示できますか?
Coder123

11

これは私のために働いたものであり、フォーカスを設定し、キーボードも表示します

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);

1
ありがとう。setFocusableAPI 26 setFocusableInTouchModeが必要です。また、私の場合は必要ありませんでした。
CoolMind 2018

8

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

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

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

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

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


6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

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

4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);


2

Xamarin.Androidの場合、この拡張機能を作成しました。

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}

2

マニフェストでこのコードを試してください

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

2

requestFocus()レイアウトがインフレートされる前に呼び出そうとすると、falseが返されます。このコードは、レイアウトが膨らんだ後に実行されます。上記のように 200ミリ秒の遅延は必要ありません。

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

あなたがすでに解決策を見つけたかどうかはわかりませんが、もう一度フォーカスを要求した後の編集の問題のために:

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

これで問題が解決した場合はお知らせください。完全な解決策への回答を編集します。


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

0

requestFocus()in を使用するとonCreate()、キーボードがタップで表示されない問題が発生するBindingAdapter場合は、SingleLiveEventを使用して、その内部にフォーカスを要求します。

方法は次のとおりです。

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

ここに私の答え

公式ドキュメントを読んだとき、これが最良の答えだと思います。EditTextなどのパラメーターにViewを渡すだけですが、showSoftKeyboardはランドスケープで機能していないようです

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.