ย้ายไปที่ EditText อื่นเมื่อ Soft Keyboard Next ถูกคลิกบน Android


216

เมื่อฉันกด 'ถัดไป' โฟกัสบน User EditText จะต้องย้ายไปที่รหัสผ่าน จากนั้นจากรหัสผ่านมันจะต้องย้ายไปทางขวาและอื่น ๆ คุณสามารถช่วยฉันในการเขียนโค้ดได้ไหม?

ป้อนคำอธิบายรูปภาพที่นี่

<LinearLayout
    android:id="@+id/LinearLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="User Name*" />

    <EditText
        android:id="@+id/txt_User"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true" />

</LinearLayout>


<LinearLayout
    android:id="@+id/LinearLayout02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Password"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

    <TextView
        android:id="@+id/confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Confirm"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

</LinearLayout>

1
ดูที่ android: imeOptions
Tobrun

ฉันจะใส่รหัสนั้นได้ที่ไหน
androidBoomer

คำตอบ:


474

การจัดการโฟกัส

การเคลื่อนไหวโฟกัสขึ้นอยู่กับอัลกอริทึมซึ่งค้นหาเพื่อนบ้านที่ใกล้ที่สุดในทิศทางที่กำหนด ในกรณีที่ไม่ค่อยเกิดขึ้นอัลกอริทึมเริ่มต้นอาจไม่ตรงกับพฤติกรรมที่ตั้งใจไว้ของผู้พัฒนา

เปลี่ยนพฤติกรรมเริ่มต้นของการนำทางทิศทางโดยใช้แอตทริบิวต์ XML ต่อไปนี้:

android:nextFocusDown="@+id/.."  
android:nextFocusLeft="@+id/.."    
android:nextFocusRight="@+id/.."    
android:nextFocusUp="@+id/.."  

นอกจากการนำทางทิศทางคุณสามารถใช้การนำทางแท็บ สำหรับสิ่งนี้คุณต้องใช้

android:nextFocusForward="@+id/.."

ในการรับมุมมองเฉพาะเพื่อทำการโฟกัสโทร

view.requestFocus()

ในการฟังเหตุการณ์การเปลี่ยนโฟกัสให้ใช้ View.OnFocusChangeListener


ปุ่มคีย์บอร์ด

คุณสามารถใช้android:imeOptionsสำหรับจัดการปุ่มพิเศษนั้นบนคีย์บอร์ดของคุณ

คุณสมบัติเพิ่มเติมที่คุณสามารถเปิดใช้งานใน IME ที่เกี่ยวข้องกับโปรแกรมแก้ไขเพื่อปรับปรุงการรวมกับแอปพลิเคชันของคุณ ค่าคงที่นี้ตรงกับค่าที่กำหนดโดย imeOptions

ค่าคงที่ของ imeOptions รวมถึงการกระทำและธงที่หลากหลายดูลิงค์ด้านบนสำหรับค่าของพวกเขา

ตัวอย่างค่า

ActionNext :

คีย์การดำเนินการดำเนินการ "ถัดไป" นำผู้ใช้ไปยังฟิลด์ถัดไปที่จะยอมรับข้อความ

ActionDone :

คีย์การดำเนินการดำเนินการ "เสร็จสิ้น" โดยทั่วไปหมายถึงไม่มีอะไรให้ใส่และ IME จะถูกปิด

ตัวอย่างรหัส:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="32dp"
        android:layout_marginTop="16dp"
        android:imeOptions="actionNext"
        android:maxLines="1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="24dp"
        android:imeOptions="actionDone"
        android:maxLines="1"
        android:ems="10" />

</RelativeLayout>

หากคุณต้องการที่จะฟัง imeoptions TextView.OnEditorActionListenerเหตุการณ์ใช้

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});


20
ในกรณีของฉันandroid:nextFocusForward="@+id/.."ทำเคล็ดลับ
Mr.Moustard

23
ฉันใส่ลงandroid:imeOptions="actionNext"ใน EditTexts ของฉันทั้งหมดและปัญหาได้หายไป ขอบคุณมาก
Joaquin Iurchuk

3
ฉันต้องใช้ทั้ง joaquin และ Mr.Moustard สำหรับแต่ละ EditText
Scott Biggs

9
สำหรับแอปของฉันเพียงใช้ android: imeOptions = "actionNext" ไม่ทำงาน EditText ต้องการ android: inputType = "[something]" ก่อนที่มันจะฟังแฟล็ก imeOptions
Chris Kelly

4
มันจะรู้ได้อย่างไรว่าโฟกัสอันไหนเมื่อกด NEXT? มันตรวจสอบ "ถูกต้อง" และ "ลง" หรือไม่? มีฟังก์ชั่นเพื่อให้ได้รหัสของมุมมองต่อไปเพื่อทำการโฟกัสหรือไม่ถ้าผู้ใช้กดปุ่ม NEXT?
นักพัฒนา Android

66
android:inputType="text"

ควรให้ผลเช่นเดียวกัน หลังจากกดปุ่มถัดไปเพื่อนำโฟกัสไปยังองค์ประกอบถัดไป

android:nextFocusDown="@+id/.."

ใช้สิ่งนี้เพิ่มเติมหากคุณไม่ต้องการมุมมองถัดไปเพื่อรับโฟกัส


34

เพิ่มข้อความแก้ไขของคุณ

android:imeOptions="actionNext"
android:singleLine="true"

เพิ่มคุณสมบัติให้กับกิจกรรมในไฟล์ Manifest

    android:windowSoftInputMode="adjustResize|stateHidden"

ในรูปแบบไฟล์ ScrollView ตั้งค่าเป็นรูปแบบรากหรือผู้ปกครองทั้งหมด UI

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.ukuya.marketplace.activity.SignInActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

       <!--your items-->

    </ScrollView>

</LinearLayout>

หากคุณไม่ต้องการทุกครั้งที่เพิ่มให้สร้างสไตล์: เพิ่มสไตล์ในค่า / style.xml

เริ่มต้น / สไตล์:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="editTextStyle">@style/AppTheme.CustomEditText</item>
    </style>

<style name="AppTheme.CustomEditText"     parent="android:style/Widget.EditText">
        //...
        <item name="android:imeOptions">actionNext</item>
        <item name="android:singleLine">true</item>
    </style>

การใช้งานของandroid:singleLine="true"depricated
Praveenkumar

18

ใช้บรรทัดต่อไปนี้

android:nextFocusDown="@+id/parentedit"

parenteditคือ ID ของรายการถัดไปที่EditTextจะถูกโฟกัส

บรรทัดข้างต้นจะต้องมีบรรทัดต่อไปนี้

android:inputType="text"

หรือ

android:inputType="number"

ขอบคุณสำหรับคำแนะนำ @Alexei Khlebnikov


3
มันใช้งานได้สำหรับฉัน ร่วมกับหรือandroid:inputType="text" android:inputType="number"
Alexei Khlebnikov

ถ้า nextFocusDown ไม่ทำงานให้ใช้ nextFocusForward มันช่วยฉันได้
Kishan Solanki

android: nextFocusDown = "@ + id / parentedit" ได้ผลสำหรับฉัน! ขอบคุณ
DIRTY DAVE

12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

การเพิ่มเขตข้อมูลพิเศษ

หุ่นยนต์: inputType = "textNoSuggestions"

ทำงานในกรณีของฉัน!


9
<AutoCompleteTextView
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/user"
                android:hint="@string/username"
                android:inputType="text"
                android:maxLines="1"
                android:imeOptions="actionNext"
                android:singleLine="true" />

สามบรรทัดนี้ใช้เวทมนตร์

            android:maxLines="1"
            android:imeOptions="actionNext"
            android:singleLine="true"

6

ในตัวจัดการ onEditorAction ของคุณโปรดจำไว้ว่าคุณต้องส่งคืนบูลีนที่ระบุว่าคุณกำลังจัดการกับการกระทำ (จริง) หรือถ้าคุณใช้ตรรกะบางอย่างและต้องการพฤติกรรมปกติ (เท็จ) ดังตัวอย่างต่อไปนี้:

EditText te = ...
te.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // Some logic here.
            return true; // Focus will do whatever you put in the logic.
        }
        return false;  // Focus will change according to the actionId
    }
});

ฉันพบสิ่งนี้เมื่อฉันกลับคืนสู่สภาพจริงหลังจากปฏิบัติตามลอจิกตั้งแต่โฟกัสไม่ขยับ


3

เพียงแค่ใช้รหัสต่อไปนี้มันจะทำงานได้ดีและใช้ inputType สำหรับทุก edittext และปุ่มถัดไปจะปรากฏในแป้นพิมพ์

android:inputType="text" or android:inputType="number" etc

2

ในบางกรณีคุณอาจต้องย้ายโฟกัสไปยังฟิลด์ถัดไปด้วยตนเอง:

focusSearch(FOCUS_DOWN).requestFocus();

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


2

วิธีง่ายๆเมื่อคุณมีเพียงไม่กี่ฟิลด์ทีละ:

จำเป็นต้องตั้งค่า

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <-ตั้งค่าประเภทข้อความของคุณในกรณีอื่นมันจะเป็น Multiline และป้องกันไม่ให้ดำเนินการต่อไป

ตัวอย่าง:

<EditText android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:textSize="@dimen/text_large"
              android:maxLines="1"
              android:inputType="textEmailAddress"
              android:imeOptions="actionNext"
              android:layout_marginLeft="@dimen/element_margin_large"
              android:layout_marginRight="@dimen/element_margin_large"
              android:layout_marginTop="0dp"/>

2

ลองใช้android: imeOptions =แท็ก"actionNext"สำหรับทุก editText ในมุมมองโดยอัตโนมัติจะเน้นไปที่ edittext ถัดไปเมื่อคุณคลิกที่ Next ของ softKeyboard


1
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="vertical" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="666dp"
android:background="#1500FFe5"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
    android:id="@+id/TextView02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editGrWt"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />
  <EditText
    android:id="@+id/editDWt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/TextView02"
    android:layout_alignLeft="@+id/editGrWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusLeft="@+id/editDRate"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"

    />
 <requestFocus />


<TextView
    android:id="@+id/TextView03"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/TextView02"
    android:layout_below="@+id/TextView02"
    android:layout_marginTop="14dp"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editDWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView03"
    android:layout_alignBottom="@+id/TextView03"
    android:layout_alignLeft="@+id/editDWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:text="0"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"/>
 <requestFocus />

<TextView
    android:id="@+id/TextView04"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editDWt1"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="         Stone :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView04"
    android:layout_alignBottom="@+id/TextView04"
    android:layout_alignLeft="@+id/editDWt1"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusForward="@+id/editStRate1"
    android:imeOptions="actionNext" />
 <requestFocus />
  <TextView
     android:id="@+id/TextView05"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignLeft="@+id/TextView04"
     android:layout_below="@+id/editStRate1"
     android:layout_marginTop="14dp"
     android:ems="6"
     android:text="         Stone :"
     android:textColor="@color/background_material_dark"
     android:textSize="15sp" />


</RelativeLayout>

</ScrollView>

4
คุณอาจต้องการอธิบายด้วยคำตอบเพื่ออธิบายว่าทำไมของคุณถึงดีกว่าตัวอื่น คุณสามารถกดปุ่ม "แก้ไข" เพื่อเพิ่มคำตอบของคุณ
Brian Tompsett - 汤莱恩


1

เพิ่ม inputType ให้กับ edittext และเมื่อป้อนมันจะไปที่ edittext ถัดไป

android:inputType="text"
android:inputType="textEmailAddress"
android:inputType="textPassword" 

และอื่น ๆ อีกมากมาย.

inputType = textMultiLine ไม่ได้ไปที่ edittext ถัดไปเมื่อเข้าสู่


1

ใน Kotlin ฉันใช้ Bellow like ..

  1. XML:

    <EditText
      android:id="@+id/et_amount"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:imeOptions="actionNext"
      android:inputType="number"
      android:singleLine="true" />
  2. ใน kotlin:

    et_amount.setOnEditorActionListener { v, actionId, event ->
    
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // do some code
            true
        } else {
            false
        }
    }

0
Inside Edittext just arrange like this


<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:imeOptions="actionNext" //now its going to rightside/next field automatically
    ..........
    .......

</EditText>

0

หากคุณมีองค์ประกอบในมุมมองเลื่อนคุณสามารถแก้ไขปัญหานี้ได้เช่น:

<com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_password"
                android:inputType="textPassword"
                android:focusable="true"
                android:imeOptions="actionNext"
                android:nextFocusDown="@id/ed_confirmPassword" />

และในกิจกรรมของคุณ:

edPassword.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                focusOnView(scroll,edConfirmPassword);
                return true;
            }
            return false;
        }
    });

public void focusOnView(ScrollView scrollView, EditText viewToScrollTo){
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.smoothScrollTo(0, viewToScrollTo.getBottom());
            viewToScrollTo.requestFocus();
        }
    });
}

0

วิธีง่าย ๆ :

  • เลื่อนเคอร์เซอร์อัตโนมัติไปที่ edittext ถัดไป
  • หาก edittext เป็นอินพุตสุดท้าย -> แป้นพิมพ์ที่ซ่อนอยู่

เพิ่มฟิลด์นี้ไปยัง edittext ในไฟล์. xml

android:inputType="textCapWords"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.