Câu hỏi Dừng EditText khỏi lấy tiêu điểm khi khởi động Hoạt động


tôi có một Activity trong Android, với hai yếu tố:

  1. EditText 
  2. ListView

Khi tôi Activity bắt đầu, EditText ngay lập tức có tiêu điểm đầu vào (con trỏ nhấp nháy). Tôi không muốn bất kỳ kiểm soát để có tập trung đầu vào lúc khởi động. Tôi đã thử:

EditText.setSelected(false);

Không may mắn. Làm thế nào tôi có thể thuyết phục EditText không chọn chính nó khi Activity bắt đầu?


2390
2017-10-12 15:03


gốc


Trước khi bạn sử dụng bất kỳ hack hacks nào bên dưới, hãy kiểm tra xem bạn có không có <requestFocus /> dòng trong bố cục XML của bạn (chi tiết hơn trong câu trả lời của @ floydaddict). Trình soạn thảo WYSIWYG của Eclipse tự động thêm nó. Sau khi loại bỏ dòng này, vấn đề đã biến mất đối với tôi. - DzinX
loại bỏ chỉ <requestFocus /> không hoạt động trên Asus Nexus 7 với KitKat 4.4.4 nhưng câu trả lời của @ Joe hoạt động - user13267
Tôi chỉ sử dụng android: focusableInTouchMode = "true" trên bố cục bố cục của tôi và làm việc cho tôi. - Herman
Người duy nhất làm việc cho tôi là giải pháp của rallat - vivoconunxino
@Herman cảm ơn !! giải pháp đơn giản của bạn làm việc cho tôi - Adiyat Mubarak


Các câu trả lời:


Câu trả lời tuyệt vời từ Luc và Mark tuy nhiên một mẫu mã tốt bị thiếu. Thêm thẻ android:focusableInTouchMode="true" đến <LinearLayout> như ví dụ sau sẽ khắc phục sự cố.

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>

2032
2017-11-02 15:49



Điều gì về việc thiết lập cha mẹ bố cục đến android:focusableInTouchMode="true"! - Muhammad Babar
Hoàn hảo! Cảm ơn ... Một điều cần lưu ý là các mặt hàng giả phải được TẮM QUYỀN TRƯỚC KHI yếu tố có thể lấy được !!! Tôi đã có một TextView giữa giả của tôi và EditText và phương pháp đã không hoạt động! - maddob
thiết lập android: focusableInTouchMode = "true" thành bố cục cha mẹ là cách tiếp cận tốt nhờ @Muhammad Babar - sujith s
ai đó có thể giải thích lý do tại sao điều này hoạt động? - Pietro Rea
@PietroRea Android có các hành vi tự động tập trung gây phiền nhiễu được tích hợp vào hành vi cốt lõi của cấu trúc ứng dụng của nó. Nếu bạn cho biết rằng văn bản chỉnh sửa đang phát hành hoặc mất tiêu điểm, nó sẽ tự động đưa ra quyết định về vị trí trọng tâm. Nếu không có đối tượng mới để lấy tiêu điểm, nó sẽ chọn phần tử có thể lấy nét đầu tiên trong bố cục ngay cả khi phần tử đó là phần tử vừa xóa tiêu điểm của nó! Đó là kinda hạt và bực bội, nhưng có thể có một lý do hợp lệ cho loại hành vi này. - Weston Wedding


Là vấn đề thực tế mà bạn chỉ không muốn nó có tập trung ở tất cả? Hoặc bạn không muốn nó hiển thị bàn phím ảo như là kết quả của việc tập trung EditText? Tôi không thực sự thấy vấn đề với EditText tập trung vào bắt đầu, nhưng nó chắc chắn là một vấn đề để cửa sổ softInput mở khi người dùng không yêu cầu rõ ràng để tập trung vào EditText (và mở bàn phím như một kết quả).

Nếu đó là vấn đề của bàn phím ảo, hãy xem AndroidManifest.xml  Phần tử <activity> tài liệu.

android:windowSoftInputMode="stateHidden" - Luôn ẩn nó khi tham gia hoạt động.

hoặc là android:windowSoftInputMode="stateUnchanged" - đừng thay đổi nó (ví dụ: đừng chỉ nếu nó chưa được hiển thị, nhưng nếu nó đã được mở khi vào hoạt động, hãy để nó mở).


1567
2018-04-09 21:22



nhưng con trỏ vẫn ở trong EditText đầu tiên trong bố cục - mặc dù bàn phím không được hiển thị - martyglaubitz
@Anderson: Không có gì về câu trả lời ngụ ý rằng nó sẽ ngăn chặn EditText từ việc lấy tiêu điểm. Nó thực sự nói rõ rằng đây là cách bạn ngăn chặn bàn phím phần mềm IME tự động mở trên tiêu điểm; bởi vì có nhiều khả năng mối quan tâm lớn hơn là bàn phím mềm xuất hiện đột ngột, không phải chính bản thân nó. Nếu vấn đề của bạn là với EditText thực sự có sự tập trung ở tất cả, sau đó sử dụng câu trả lời của người khác. - Joe
đặt nó theo chương trình: stackoverflow.com/questions/6138330/… - Nick Franceschina
Đừng làm điều này trên một hoạt động với một máy ảnh - nó phá vỡ thời gian của đèn flash (không hỏi tôi tại sao) - Daniel Wilson
Một lý do để không tập trung vào lúc khởi động là nếu imeOptions được thay đổi sau chế độ xem có tiêu điểm và bàn phím hiển thị, các imeOptions sẽ được đặt trước khi thay đổi. - n_b


Một giải pháp đơn giản hơn tồn tại. Đặt các thuộc tính này trong bố cục mẹ của bạn:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

Và bây giờ, khi hoạt động bắt đầu, bố cục chính này sẽ được lấy nét theo mặc định.

Ngoài ra, chúng tôi có thể xóa tiêu điểm khỏi chế độ xem con lúc chạy (ví dụ: sau khi hoàn tất chỉnh sửa con) bằng cách đặt trọng tâm vào bố cục chính lần nữa, như sau:

findViewById(R.id.mainLayout).requestFocus();

Nhận xét tốt từ Guillaume Perrot:

android:descendantFocusability="beforeDescendants" dường như là   mặc định (giá trị số nguyên là 0). Nó hoạt động chỉ bằng cách thêm    android:focusableInTouchMode="true".

Thực sự, chúng ta có thể thấy rằng beforeDescendants đặt làm mặc định trong ViewGroup.initViewGroup() phương pháp (Android 2.2.2). Nhưng không bằng 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Nhờ Guillaume.


1014
2017-12-26 23:35



Điều quan trọng là phải đặt các thuộc tính này cho thẳng thắn cấp độ gốc của chế độ xem sẽ tập trung vào việc tạo hoạt động, nếu không nó sẽ không hoạt động. - tomrozb
Lưu ý điều này dường như không hoạt động nếu cha mẹ là một ScrollView - Daniel Wilson
Chỉ là một giải pháp hoàn hảo. Hoạt động cho cả hai: 1. Tắt tự động lấy nét và 2. Tắt tự động mở bàn phím mềm - Meet
Tốt đẹp. Nó không cần phải là một phụ huynh trực tiếp. Tôi đặt nó ở cấp độ gốc của bố trí và nó có vẻ làm việc tốt. - Kurotsuki
@DanielWilson khi nào bạn muốn một scrollview là cha mẹ trực tiếp của một edittext? - Mark Buikema


Giải pháp duy nhất tôi tìm thấy là:

  • Tạo một LinearLayout (Tôi không biết nếu các loại Bố cục khác sẽ hoạt động)
  • Đặt thuộc tính android:focusable="true" và android:focusableInTouchMode="true"

EditText sẽ không tập trung sau khi bắt đầu hoạt động


386
2017-10-23 08:12



Đơn giản!! Ban đầu tôi đã thêm các thuộc tính này vào chế độ xem gốc, không thành công, sau đó tôi đặt các thuộc tính này sang bố cục khác và hoạt động tốt. Cảm ơn!! - Rino
Nó cũng làm việc với RelativeLayout. - Brian Reinhold


Vấn đề dường như đến từ một tài sản mà tôi chỉ có thể thấy trong XML form của bố cục.

Đảm bảo xóa dòng này ở cuối khai báo trong EditText Các thẻ XML:

<requestFocus />

Điều đó sẽ cho một cái gì đó như thế:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

67
2018-03-13 09:57





bằng cách sử dụng thông tin được cung cấp bởi các áp phích khác, tôi đã sử dụng giải pháp sau:

trong XML bố trí

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

trong onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

và cuối cùng, trong onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

63
2018-05-26 21:07





Sau đây sẽ dừng edittext từ lấy nét khi tạo ra, nhưng lấy nó khi bạn chạm vào chúng.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Vì vậy, bạn đặt tiêu điểm thành false trong xml, nhưng khóa nằm trong java, mà bạn thêm người nghe sau đây:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Vì bạn đang trả về false, tức là không tiêu thụ sự kiện, hành vi tập trung sẽ diễn ra như bình thường.


58
2018-06-15 04:45



Nhưng điều này sẽ không bao giờ được tập trung trong tương lai, làm thế nào để chỉ dừng lại tập trung chỉ cho ban đầu (hoạt động bắt đầu) ?? - Jayesh
OnTouchListener được gọi trước các hành động cảm ứng khác. Vì vậy, bằng cách cho phép lấy nét khi chạm vào tiêu điểm, tiêu điểm sẽ xảy ra khi chạm lần đầu. Bàn phím sẽ xuất hiện và mọi thứ. - MinceMan
Tôi nghĩ đây là cách tốt nhất để làm điều đó. Ngoài ra, mã giả ma thuật mumbo-jumbo xml ở trên KHÔNG làm việc cho một tập hợp văn bản chỉnh sửa phức tạp ... Nếu điều này làm việc, tôi chắc chắn sẽ bỏ phiếu. - Radu
Nhưng nếu bạn đang có nhiều văn bản chỉnh sửa, nó sẽ tập trung vào văn bản chỉnh sửa tiếp theo và mở bàn phím để tốt hơn là thêm android: windowSoftInputMode = "stateAlwaysHidden" trong tệp kê khai cho hoạt động cụ thể. - Karan sharma
Lưu ý: trên Android P, hệ thống sẽ không còn lấy tiêu điểm mặc định nữa. Điều này có nghĩa rằng hack này là không cần thiết bắt đầu với P. - MinceMan


Thử clearFocus () thay vì setSelected(false). Mọi chế độ xem trong Android đều có khả năng tập trung và khả năng lựa chọn, và tôi nghĩ rằng bạn muốn chỉ xóa tiêu điểm.


54
2017-10-12 19:02



Điều đó nghe có vẻ đầy hứa hẹn, nhưng tại thời điểm nào trong vòng đời Activity thì nó nên được gọi? Nếu tôi gọi nó trong onCreate (), EditText vẫn có tiêu điểm. Nó có nên được gọi trong onResume () hoặc một số vị trí khác không? Cảm ơn! - Mark
Tôi kết hợp câu trả lời được chấp nhận với câu trả lời này. tôi đã gọi myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); bên trong onResume Hoạt động. Điều này đảm bảo EditText không giữ tiêu điểm khi điện thoại được xoay. - teedyay


Tôi đã thử câu trả lời serval riêng nhưng trọng tâm vẫn là EditText. Tôi chỉ quản lý để giải quyết nó bằng cách sử dụng hai giải pháp trên cùng với nhau.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Tham khảo từ Bạc https://stackoverflow.com/a/8639921/15695 )

và xóa

 <requestFocus />

tại EditText

(Tham khảo từ floydaddict https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32



Tôi phải thêm edittext.clearFocus () vào phần bên trên để làm cho nó hoạt động :) - Nav


Không có giải pháp nào phù hợp với tôi. Cách tôi sửa tự động lấy nét là:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

37
2017-11-30 16:37



android: windowSoftInputMode = "adjustPan" trên bất kỳ hoạt động nào trong Tệp kê khai Android - rallat
không chắc chắn làm thế nào bạn figured này ra, nhưng kudo bro! Những công việc này. - portfoliobuilder


Giải pháp đơn giản: Trong AndroidManifest trong Activity sử dụng thẻ

android:windowSoftInputMode="stateAlwaysHidden"

31
2018-03-17 15:42



Nói đúng ra, điều này không giải quyết được vấn đề. OP cho biết: "Tôi không muốn bất kỳ kiểm soát để có tập trung đầu vào lúc khởi động." Giải pháp của bạn chỉ ẩn bàn phím, có sự khác biệt sublte. - katzenhut
giải pháp tốt nhất !! được biết đến của giải pháp trên làm việc cho tôi. lãng phí khoảng một giờ trên điều nhỏ nhặt này - Hamza Zaidi
@ katzenhut yep, đó là vấn đề của tôi với câu trả lời này chính xác. Tập trung vào edittext của tôi sẽ mở ra một hoạt động PlaceAutoComplete, vì vậy câu trả lời này chưa hoàn thành - Zach
Câu trả lời này sẽ hoàn thành nếu câu hỏi là: Làm cách nào để tôi luôn đảm bảo hoạt động của mình không bao giờ hiển thị bàn phím. Cái nào không. - Martin Marconcini