ตั้งโฟกัสไปที่ EditText


178

ฉันมี EditText-Field และตั้ง OnFocusChangeListener สำหรับมัน เมื่อสูญเสียโฟกัสวิธีการที่เรียกว่าซึ่งตรวจสอบค่าของ EditText กับหนึ่งในฐานข้อมูล หากคืนค่าของวิธีการเป็นจริงขนมปังปิ้งจะปรากฏขึ้นและโฟกัสควรกลับไปที่ EditText อีกครั้ง โฟกัสควรกลับไปที่ EditText เสมอและแป้นพิมพ์ควรแสดงจนกระทั่งค่าส่งคืนของวิธีนั้นเป็นเท็จ

แก้ไข: ฉันคิดว่าฉันยังไม่ได้ทำให้ปัญหาที่แท้จริงของฉันชัดเจนอย่างสมบูรณ์ยัง: ไม่มีรายการอื่น ๆ บนหน้าจอควรจะสามารถแก้ไขได้จนกว่าค่าของ EditText จะถูกแก้ไขเป็นค่าซึ่งทำให้วิธีการ "checkLiganame (liganame) "คืนค่าเท็จ เฉพาะ 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 แรก ฉันพยายามแก้ไข String แต่ไม่มีอะไรเกิดขึ้น สตริงใหม่ของฉันแสดงใน EditText ที่สองแทน ฉันคลิกที่ลูกศรย้อนกลับของอุปกรณ์ของฉันและ reclick ที่ 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();
        }
    }
}

หากคำตอบด้านล่างนี้ช่วยคุณได้โปรดตอบหนึ่งในคำตอบ
Akshatha Srinivas

คำตอบ:


278

เพียงแค่ใส่บรรทัดนี้กับคุณ onCreate()

editText.requestFocus();

มันใช้งานได้สำหรับฉันหวังว่ามันจะช่วย


163

การขอโฟกัสไม่เพียงพอที่จะแสดงแป้นพิมพ์

ในการรับโฟกัสและแสดงแป้นพิมพ์คุณจะต้องเขียนดังนี้:

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

แก้ไข: การเพิ่มข้อมูลพิเศษให้กับคำตอบหลังจากที่เพิ่มวิธีการ checkLiganame

ในเมธอด checkLiganame คุณตรวจสอบว่าเคอร์เซอร์เป็นโมฆะหรือไม่ เคอร์เซอร์จะส่งคืนวัตถุเสมอดังนั้นการตรวจสอบ null จะไม่ทำอะไรเลย อย่างไรก็ตามปัญหาอยู่ในบรรทัดdb.close();

เมื่อคุณปิดการเชื่อมต่อฐานข้อมูลCursorกลายเป็นไม่ถูกต้องและส่วนใหญ่อาจเป็นโมฆะ

ดังนั้นให้ปิดฐานข้อมูลหลังจากดึงค่าแล้ว

แทนที่จะตรวจสอบเคอร์เซอร์เพื่อหาค่าว่างคุณควรตรวจสอบว่าจำนวนแถวที่ส่งคืนมีค่ามากกว่า 0: if (cursor.getCount ()> 0) แล้วตั้งค่าบูลีนของคุณเป็นจริงถ้าเป็นเช่นนั้น

แก้ไข 2: ดังนั้นนี่คือรหัสบางส่วนสำหรับวิธีการทำงาน EDIT3: ขออภัยรหัสผิดฉันเพิ่ม ... ;

ก่อนอื่นคุณต้องล้างโฟกัสหากอีก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

ดังนั้น CheckLiganame ทำอะไรกันแน่ ทำไมคุณไม่ลองตรวจสอบ (liganame.isEmpty ()) และดูว่าเป็นเรื่องจริงหรือไม่ให้ขอโฟกัสอีกครั้ง
Darwind

1
ขอบคุณ :-) ตอนนี้วิธีการของฉันทำงานอย่างถูกต้อง :-) แต่ปัญหาหลักของฉันกับ EditText-Field ยังไม่ได้รับการแก้ไข ฉันยังไม่สามารถแก้ไขได้หลังจากที่วิธีการที่ได้พบแถว ...
erdalprinz

ดังนั้นคุณเพิ่มถ้า (myEditText.requestFocus ()) {getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } ภายในผู้ฟัง onFocusChanged?
Darwind

ใช่ฉันทำ. ภายใต้ Liganame.requestFocus (); ฉันคลิก "ถัดไป" บนแป้นพิมพ์เพื่อข้ามไปยัง EditText-Field ถัดไป ขนมปังปิ้งกำลังแสดงและให้ความสำคัญกับทั้ง EditText-Fields แต่ฉันแก้ไขได้เฉพาะอันที่สองเท่านั้น คนแรกซึ่งควรจะเป็นคนเดียวที่มีความสำคัญในกรณีนี้ไม่สามารถแก้ไขได้อีกต่อไป
erdalprinz

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 ms จำเป็นหรือไม่ฉันสามารถแสดงได้ทันที
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
ขอบคุณ setFocusableต้องใช้ API 26 setFocusableInTouchModeในกรณีของฉันก็ไม่จำเป็นเช่นกัน
CoolMind

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

คุณสามารถทำได้ด้วยบรรทัดเดียว:

yourEditText.RequestFocusFromTouch();

จริงๆแล้วนี่เป็นคำตอบเดียวที่เหมาะกับฉัน มันจำลองการสัมผัสเช่นเดียวกับที่ฉันต้องการ
Antonio Vlasic

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

หากคุณพยายามโทรrequestFocus()ก่อนเลย์เอาต์เกินจริงก็จะส่งคืนเท็จ รหัสนี้ทำงานหลังจากโครงร่างได้รับการขยาย คุณไม่จำเป็นต้อง 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

ฉันไม่ทราบว่าคุณพบวิธีแก้ไขปัญหา แต่สำหรับปัญหาการแก้ไขของคุณหลังจากขอโฟกัสอีกครั้ง:

คุณลองโทรหาวิธีการselectAll()หรือsetSelection(0)(ถ้าเป็น emtpy) ใน edittext1 ของคุณหรือไม่?

โปรดแจ้งให้เราทราบหากสิ่งนี้ช่วยได้ดังนั้นฉันจะแก้ไขคำตอบของฉันสำหรับโซลูชันที่สมบูรณ์


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

0

หากใช้requestFocus()ในการonCreate()แนะนำปัญหาของแป้นพิมพ์ที่ไม่แสดงในการใช้งานให้BindingAdapterใช้SingleLiveEventและขอโฟกัสภายในที่

นี่คือวิธีการ:

BindingAdapter

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

0

คำตอบของฉันที่นี่

เมื่อฉันอ่านเอกสารอย่างเป็นทางการฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพียงส่งพารามิเตอร์ View to เช่น EditText ของคุณ แต่ 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.