Tetapkan Fokus pada EditText

177

Saya memiliki EditText-Field dan mengatur OnFocusChangeListener untuk itu. Ketika kehilangan fokus, sebuah metode dipanggil, yang memeriksa nilai EditText dengan satu di database. Jika nilai pengembalian metode ini benar, bersulang ditampilkan dan fokus harus kembali pada EditText lagi. Fokus harus selalu kembali pada EditText dan keyboard akan ditampilkan, sampai nilai pengembalian metode salah.

EDIT: Saya pikir, saya belum membuat masalah nyata saya menjadi sangat jelas: Tidak ada Item lain di Layar yang dapat diedit, sampai nilai EditText diedit ke nilai, yang membuat metode "checkLiganame (liganame) "return false. Hanya Bidang-EditTeks yang dapat diedit.

ini kode saya (yang tidak berfungsi untuk saya):

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

dan metodenya:

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

Kode ini mengarah ke hasil berikut: Setelah EditText kehilangan fokus, fokus melompat kembali ke EditText, tetapi saya tidak dapat mengedit teks lagi.

EDIT2: Mengubah kode saya. Skenario:

Saya klik pada EditText pertama dan meletakkan String di dalamnya, yang sudah ada di database. Roti panggang ditampilkan. Sekarang saya tidak bisa lagi mengedit String saya. Saya klik "berikutnya" pada keyboard dan fokusnya tetap pada EditText pertama. Saya mencoba mengedit String saya, tetapi tidak ada yang terjadi. Alih-alih, String saya yang baru muncul di EditText kedua. Saya mengklik panah belakang perangkat saya dan mengklik kembali EditText pertama dan kedua -> tidak ada keyboard yang ditampilkan.

Ini kode baru saya:

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();
        }
    }
}
erdalprinz
sumber
Jika jawaban di bawah ini membantu Anda, terimalah salah satu jawaban
Akshatha Srinivas

Jawaban:

276

Cukup letakkan baris ini di onCreate()

editText.requestFocus();

Ini bekerja untuk saya, semoga membantu

ralphgabb
sumber
163

Meminta fokus tidak cukup untuk menampilkan keyboard.

Untuk mendapatkan fokus dan menampilkan keyboard Anda akan menulis sesuatu seperti ini:

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

EDIT: Menambahkan info tambahan ke jawaban setelah metode checkLiganame ditambahkan.

Dalam metode checkLiganame Anda memeriksa apakah kursornya nol. Kursor akan selalu mengembalikan objek, jadi centang untuk null tidak melakukan apa-apa. Namun masalahnya ada di jalurdb.close();

Ketika Anda menutup koneksi database, Cursormenjadi tidak valid dan kemungkinan besar dibatalkan.

Jadi tutup basis data setelah Anda mengambil nilainya.

Alih-alih memeriksa kursor untuk null, Anda harus memeriksa apakah jumlah baris yang dikembalikan lebih dari 0: jika (cursor.getCount ()> 0) dan kemudian atur boolean Anda menjadi true jika demikian.

EDIT2: Jadi inilah beberapa kode untuk membuatnya berfungsi. EDIT3: Maaf saya menambahkan kode yang salah ...; S

Pertama, Anda perlu menghapus fokus jika orang lain EditTextmendapatkan fokus. Ini bisa dilakukan dengan myEditText.clearFocus(). Kemudian di onFocusChangeListener Anda seharusnya tidak terlalu peduli apakah pertama-tama EditTextmemiliki fokus atau tidak, sehingga onFocusChangeListener dapat terlihat seperti ini:

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

Ganti cek pertama if(liganame.length() == 0)dengan cek Anda sendiri, maka itu harus bekerja. Perhatikan, bahwa semua tampilan EditText harus diatur onFocusChangeListenerke pendengar yang sama seperti yang saya lakukan dalam contoh.

Darwind
sumber
Terima kasih sejauh ini Tapi ini tidak menyelesaikan seluruh masalah saya. Saya mengedit deskripsi masalah saya.
erdalprinz
Jadi apa sebenarnya yang dilakukan checkLiganame? Mengapa Anda tidak bisa memeriksa apakah (liganame.isEmpty ()) dan jika itu benar, requestFocus lagi?
Darwind
1
Terima kasih :-) Sekarang metode saya berfungsi dengan benar :-) tetapi masalah utama saya dengan EditText-Field belum terpecahkan. Saya masih tidak dapat mengeditnya, setelah metode menemukan baris ...
erdalprinz
Jadi, Anda menambahkan if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Di dalam pendengar onFocusChanged?
Darwind
Ya saya lakukan. Di bawah Liganame.requestFocus () ;. Saya klik "next" pada keyboard, untuk melompat di EditText-Field berikutnya. Bersulang menunjukkan dan fokus pada KEDUA EditText-Fields. Tapi saya hanya bisa mengedit yang kedua. Yang pertama, yang seharusnya menjadi satu-satunya yang memiliki fokus dalam hal ini, tidak dapat diedit lagi.
erdalprinz
59

Kode Darwind tidak menampilkan keyboard.

Ini bekerja untuk saya:

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

jika keyboard tidak muncul, coba paksa:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Groco
sumber
19

Ini mengubah fokus EditText ketika tombol diklik:

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();
            }
        });
    }
}
Simon Chius
sumber
16

Ini bekerja dari saya:

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

Untuk menyembunyikan:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru raj
sumber
1
Mengapa Anda harus menunggu 200 ms? apakah itu perlu atau saya bisa langsung menunjukkannya?
Coder123
11

Inilah yang bekerja untuk saya, menetapkan fokus dan juga menunjukkan keyboard

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);
Berni Gf
sumber
1
Terima kasih. setFocusablemembutuhkan API 26. Juga setFocusableInTouchModetidak diperlukan dalam kasus saya.
CoolMind
8

Jika kita membuat EditText secara dinamis maka kita harus mengatur requestFocus () seperti yang diberikan di bawah ini.

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

Jika sudah kita mendeklarasikan komponen dalam tampilan xml maka kita harus menemukannya dan kita dapat fokus seperti yang diberikan di bawah ini.

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

Ini hanya menetapkan fokus ke komponen EditText yang sesuai.

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

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
sumber
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();
        }
    });
Pangeran
sumber
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

sumber
2

Anda dapat melakukan ini dengan satu baris:

yourEditText.RequestFocusFromTouch();
daniel alexandru Ganea
sumber
Sebenarnya ini adalah satu-satunya jawaban yang berhasil untuk saya. Ini mensimulasikan sentuhan seperti yang saya inginkan.
Antonio Vlasic
2

Untuk Xamarin. Android saya telah membuat ekstensi ini.

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);
        }
    }
}
c.lamont.dev
sumber
2

silakan coba kode ini pada manifes

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>
Felix Cruz
sumber
2

Jika Anda mencoba menelepon requestFocus()sebelum tata letak meningkat, itu akan kembali salah. Kode ini berjalan setelah tata letak meningkat. Anda tidak perlu keterlambatan 200 ms seperti yang disebutkan di atas .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Mücahit Şenol
sumber
1

Saya tidak tahu apakah Anda sudah menemukan solusi, tetapi untuk masalah pengeditan setelah meminta fokus lagi:

Sudahkah Anda mencoba memanggil metode selectAll()atau setSelection(0)(jika emtpy) di edittext1 Anda?

Tolong beri tahu saya jika ini membantu, jadi saya akan mengedit jawaban saya untuk solusi lengkap.

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

Jika menggunakan requestFocus()di onCreate()memperkenalkan masalah keyboard yang tidak muncul di ketuk, gunakan BindingAdaptermenggunakan SingleLiveEvent dan minta fokus di dalamnya.

Inilah cara melakukannya:

BindingAdapter

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

Jawaban saya di sini

Ketika saya membaca dokumen resmi, saya pikir ini adalah jawaban terbaik, cukup berikan parameter View to seperti EditText Anda, tetapi showSoftKeyboard sepertinya tidak bekerja pada landscape

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)
    }
}
Thành Thỏ
sumber