วิธีการตั้งค่าโฟกัสบนมุมมองเมื่อสร้างและแสดงเค้าโครง


90

ตอนนี้ฉันมีเลย์เอาต์ที่มี a Button, a TextViewและEditText. เมื่อเค้าโครงปรากฏขึ้นโฟกัสจะถูกวางโดยอัตโนมัติEditTextซึ่งจะทำให้แป้นพิมพ์ปรากฏบนโทรศัพท์ Android มันไม่ใช่สิ่งที่ฉันต้องการ มีวิธีใดบ้างที่ฉันสามารถกำหนดโฟกัสTextViewหรือไม่ใช้เลยเมื่อแสดงเค้าโครง

คำตอบ:


109

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


17

ใช้งานได้:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

มันทำอะไร? ดูเหมือนว่ากำลังปรับเปลี่ยนสถานะบางอย่างสำหรับกิจกรรมทั้งหมดไม่ใช่แค่มุมมองหรือส่วนดังนั้นฉันจึงระมัดระวังเกี่ยวกับเรื่องนี้และจะไม่ใช้มันเว้นแต่ฉันจะเข้าใจความหมายทั้งหมด
Kartick Vaddadi

อันที่จริงฉันจะไม่ทำสิ่งนี้ตามคำขอของผู้โพสต์ต้นฉบับ วิธีนี้อาจช่วยแก้ปัญหาปัจจุบันได้ แต่การใช้งานจะมีผลข้างเคียงที่อาจทำให้เกิดปัญหาในภายหลัง การแฮ็กเช่นนี้ทำให้พวกเขาเข้าสู่ฐานรหัสที่ทำให้แฮ็กอื่น ๆ ถูกเพิ่มเข้ามาในภายหลังเพื่อลบล้างแฮ็คดั้งเดิม.. วงจรอุบาทว์ยังคงดำเนินต่อไป .... และผู้คนก็สงสัยว่าทำไมโค้ดถึงไม่สามารถเข้าถึงได้ ใช่คุณเดาออก .... ฉันทำงานกับคนอื่นที่ทำเรื่องแบบนี้และทำให้ชีวิตของฉันยากลำบากมาก
dell116



6

ในการตั้งโฟกัสให้หน่วงเวลา requestFocus () โดยใช้ Handler

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

คุณสามารถลองซ่อนแป้นพิมพ์ สิ่งนี้:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

ตั้งค่าบรรทัดเหล่านี้OnResumeเป็นเช่นกันและตรวจสอบให้แน่ใจว่าfocusableInTouchถูกตั้งค่าเป็นจริงหรือไม่ในขณะที่คุณเริ่มต้นการควบคุมของคุณ

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

ในการเปลี่ยนโฟกัสทำให้ textView ใน xml สามารถโฟกัสได้

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

และใน java ในการสร้าง

textView.requestFocus();

หรือเพียงแค่ซ่อนแป้นพิมพ์

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android: focusable = "true" และ textView.requestFocus (); ทำงานให้ฉัน ขอบคุณ!
Werner

2

คำตอบข้างต้นไม่เหมาะกับฉัน โซลูชันเดียว (สมมติว่า) คือการเปลี่ยนTextViewแรกในEditText ที่ปิดใช้งาน ซึ่งได้รับโฟกัสแล้วเพิ่ม

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

ในการเรียกกลับonCreateเพื่อป้องกันไม่ให้แสดงแป้นพิมพ์ ตอนนี้ EditText แรกของฉันดูเหมือน TextView แต่สามารถรับโฟกัสเริ่มต้นได้ในที่สุด


2

คำแนะนำสุดท้ายคือทางออกที่ถูกต้อง หากต้องการทำซ้ำให้ตั้งค่าandroid:focusable="true"ในxmlไฟล์เลย์เอาต์ก่อนจากนั้นrequestFocus()ในมุมมองในโค้ดของคุณ


1

ฉันคิดว่ามุมมองข้อความไม่สามารถโฟกัสได้ ลองตั้งโฟกัสที่ปุ่มเช่นหรือตั้งค่าคุณสมบัติที่โฟกัสได้เป็นจริง


1

คุณสามารถเพิ่มข้อความแก้ไขขนาด "0 dip" เป็นตัวควบคุมแรกใน ur xml ได้ดังนั้นจะได้รับโฟกัสที่การแสดงผล (ตรวจสอบให้แน่ใจว่าโฟกัสได้และทั้งหมด ... )


1

คุณสามารถเริ่มต้นด้วยการเพิ่มandroid:windowSoftInputModeกิจกรรมของคุณในAndroidManifest.xmlไฟล์

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

สิ่งนี้จะทำให้แป้นพิมพ์ไม่แสดง แต่EditTextยังมีโฟกัสอยู่ เพื่อแก้ปัญหาที่คุณสามารถตั้งค่าandroid:focusableInTouchmodeและandroid:focusableไปtrueในมุมมองรากของคุณ

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

โค้ดด้านบนจะทำให้แน่ใจว่าRelativeLayoutได้รับโฟกัสแทนEditText


0

โฟกัสมีไว้สำหรับเลือกส่วนประกอบ UI เมื่อคุณใช้บางอย่างนอกเหนือจากการสัมผัส (เช่น d-pad แป้นพิมพ์ ฯลฯ ) ทุกมุมมองสามารถรับโฟกัสได้แม้ว่าค่าเริ่มต้นบางส่วนจะไม่สามารถโฟกัสได้ (คุณสามารถทำให้มุมมองที่ setFocusable(true)โฟกัสได้โดยใช้และบังคับให้โฟกัสด้วยrequestFocus())

แต่ก็เป็นสิ่งสำคัญที่จะทราบว่าเมื่อคุณอยู่ในโหมดสัมผัส, โฟกัสเป็นคนพิการ ดังนั้นหากคุณใช้นิ้วของคุณการเปลี่ยนโฟกัสโดยใช้โปรแกรมจะไม่ทำอะไรเลย ข้อยกเว้นสำหรับมุมมองที่รับอินพุตจากตัวแก้ไขอินพุต EditTextเป็นเช่นตัวอย่าง สำหรับสถานการณ์พิเศษนี้setFocusableInTouchMode(true)จะใช้เพื่อให้แป้นพิมพ์อ่อนทราบว่าจะส่งอินพุตไปที่ใด EditTextมีการตั้งค่านี้ไปโดยปริยาย แป้นพิมพ์อ่อนจะปรากฏขึ้นโดยอัตโนมัติ

หากคุณไม่ต้องการให้คีย์บอร์ดนุ่ม ๆ โผล่ขึ้นมาโดยอัตโนมัติคุณสามารถหยุดชั่วคราวได้ตามที่ @abeljus ระบุไว้:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

เมื่อผู้ใช้คลิกที่EditTextมันควรจะยังคงแสดงแป้นพิมพ์อยู่

อ่านเพิ่มเติม:


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